Подтвердить что ты не робот

Как передать пользовательскую информацию из Authenticator для App Engine на конечную точку?

Я ссылаюсь на замечательный ответ @MinWan на этот пост Google Cloud Endpoints и аутентификацию пользователя, где он описывает способ добавления пользовательских заголовков к запросу против облака App Engine Endpoints.

Понятно, что мы можем добавить пользовательский заголовок и написать аутентификатор для каждой службы (например, Google, Twitter, Facebook), против которой мы хотим подтвердить, где каждый аутентификатор читает конкретный заголовок и аутентифицируется против этой службы. Если токен действителен, служба обычно возвращает ответ с адресом электронной почты или идентификатором пользователя, а также дополнительную информацию [A], из которой мы создаем com.google.api.server.spi.auth.common.User, который позже передается в метод конечной точки, как com.google.appengine.api.users.User.

Первый вопрос: почему у нас есть два разных пользовательских объекта, например. пользователей с разными пространствами имен? По-видимому, это не суб/суперклассы, поэтому они, возможно, явно скрыты за кулисами.

Второй вопрос: проблема, связанная с явно выраженным сущностью пользователя, и что нет специального поля, где я мог бы добавить дополнительную информацию [A], возвращаемую службой, заключается в том, что дополнительная информация теряется. Такая дополнительная информация может быть полезна для сопоставления пользователя внешней службы oauth2 с локальным пользователем или с oauth2 пользователями, возвращаемыми другими службами.

Любой вход? Каков предложенный способ обработки нескольких служб аутентификации?

4b9b3361

Ответ 1

Только что протестирован, и вы можете определенно подкласса User, чтобы он содержал любые частные поля, которые вы хотите. Просто используйте полиморфизм наследования класса, чтобы вернуть объект этого типа из метода Authenticator, не изменяя тип пользователя по умолчанию в сигнатуре метода.

import javax.servlet.http.HttpServletRequest;
import com.google.api.server.spi.auth.common.User;
import com.google.api.server.spi.config.Authenticator;

public class BazUser extends User {
        private String secret; // extra piece of data held by this User
        public BazUser(String email) {
                super(email);
                this.secret = "notasecret";
        }
        public BazUser (String email, String secret) {
                super (email);
                this.secret = secret;
        }
}

public class BazAuthenticator implements Authenticator {
        public User authenticate(HttpServletRequest req) {
                return new BazUser ("[email protected]", "secret");
        }
}

Ответ 2

Функционально все работает с:

import com.google.api.server.spi.auth.common.User;

даже с gradle:

compile 'com.google.endpoints:endpoints-framework:2.0.0-beta.11'

Предупреждение IDE можно очистить, включив @SuppressWarnings("ResourceParameter") следующим образом:

/**
 * Adds a new PmpUser.
 *
 * @param pmpUser  pmpUser object
 */
@SuppressWarnings("ResourceParameter")
@ApiMethod(
        name = "pmpUser.post",
        path = "pmpUser",
        httpMethod = ApiMethod.HttpMethod.POST)
...