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

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

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

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

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

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 для реализации классического входа в систему на основе сеанса или используйте собственный настраиваемый заголовок. Ну, это зависит от вашего случая. Вернуть ноль, если не аутентифицирован, и вернуть объект User, когда аутентифицирован. Также реализуйте какое-то шифрование с обеих сторон (клиент и сервер), чтобы не дать кому-то, имеющему сеансовый ключ, получить доступ к вашему API.

Другие вопросы по тегам