Управление аутентификацией пользователей в приложении GAE

Как лучше всего управлять сеансом пользователя в приложении Google App Engine? В идеале я хотел бы, чтобы мое приложение не сохраняло состояние и не сохраняло данные, связанные с пользователем, в памяти, однако я также боюсь отправлять учетные данные пользователя сети по каждому запросу (не говоря уже о том, что для аутентификации пользователя по каждому запросу потребуется вызов к Datastore, который стоит денег).

Я проверил решение Google OAuth 2.0, но, насколько я понимаю, оно помогает, если мое приложение хочет подключиться к любому из API Google и ему требуется разрешение от клиента для доступа к его учетной записи Google.

Есть ли способ управления сеансом пользователя? Самый распространенный сценарий — узнать, какой пользователь инициировал этот запрос, не отправляя userId в качестве параметра запроса.

Обратите внимание, что мы не пользуемся услугами сторонних поставщиков. Пользователь обычно регистрируется на нашей странице и имеет индивидуальную учетную запись. Я не ищу инструменты, помогающие интегрировать аутентификацию со сторонними службами. В противном случае я бы использовал OAuth 2.0 Google или аналогичный API.


person PentaKon    schedule 25.05.2017    source источник
comment
Automatic — отличный ресурс: github.com/automatic/automatic.   -  person gaefan    schedule 26.05.2017
comment
Пожалуйста, просмотрите обновленный вопрос. Я не ищу аутентификацию через сторонних поставщиков.   -  person PentaKon    schedule 26.05.2017


Ответы (1)


Вы всегда можете реализовать интерфейс аутентификатора.

        public class MyAuthenticator implements Authenticator {
    @Override
    public User authenticate(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        //
        return null;// if not authenticated, otherwise return User object.
    }
}

// Endpoints class.
@Api(name = "example", authenticators = { MyAuthenticator.class })
public class MyEndpoints {
    public Profile getProfile(User user) {

        if (user == null) {
            throw new UnauthorizedException("Authorization required");
        }
        return new Profile(user.getEmail(), "displayName");
    }

    // store this class somewhere in models
    public class Profile {
        private String email;
        private String displayName;

        public Profile(String email, String displayName) {
            this.email = email;
            this.displayName = displayName;
        }

        public String getEmail() {
            return email;
        }




        public String getdisplayName() {
            return displayName;
        }
    }
}

Используйте объект HttpServletRequest для реализации классического входа на основе сеанса или используйте собственный настраиваемый заголовок. Ну, это зависит от вашего случая. Возвращает значение null, если оно не аутентифицировано, и возвращает объект пользователя, когда оно аутентифицировано. Также внедрите какое-то шифрование с обеих сторон (клиент и сервер), чтобы помешать кому-либо, имеющему сеансовый ключ, получить доступ к вашему API.

person Utkarsh Saxena    schedule 27.05.2017