Управление аутентификацией пользователя в приложении 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.