Как использовать Google API Explorer для проверки моих собственных конечных точек приложения с использованием OAuth? - программирование
Подтвердить что ты не робот

Как использовать Google API Explorer для проверки моих собственных конечных точек приложения с использованием OAuth?

У меня есть API конечных точек, развернутый в App Engine. У меня нет проблем с использованием Google API Explorer для запросов к API-методам, для которых НЕ требуется вход в систему. URL-адрес, который я использую для этого:

https://developers.google.com/apis-explorer/?base=https://[MY_APP_ID].appspot.com/_ah/API

Где я застрял, вызывается методы API, которые требуют входа пользователя в систему, например:

@ApiMethod(name = "config.get",
        clientIds = {"[MY_CLIENT_ID].apps.googleusercontent.com", "com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID"},
        audiences = {"[MY_APP_ID].appspot.com"},
        scopes = {"https://www.googleapis.com/auth/userinfo.email"})
public Config getConfig(User user) throws OAuthRequestException {
    log.fine("user: " + user);

    if (user == null) {
        throw new OAuthRequestException("You must be logged in in order to get config.");
    }

    if (!userService.isUserAdmin()) {
        throw new OAuthRequestException("You must be an App Engine admin in order to get config.");
    }
    ...

В API-интерфейсе API есть верхний правый переключатель, который при щелчке позволяет указать области и разрешить. Я делаю это с проверкой только области userinfo.email. Это не имеет значения. Ответ, который я получаю от моего звонка:

503 Service Unavailable

- Show headers -

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "java.lang.IllegalStateException: The current user is not logged in."
   }
  ],
  "code": 503,
  "message": "java.lang.IllegalStateException: The current user is not logged in."
 }
}

Назад, когда конечные точки находились в фазе доверенного тестера, я помню, что на игровой площадке OAuth2 был ручной шаг, чтобы получить токен идентификатора вместо токена доступа или некоторую вещь. Если это все еще необходимо, любое упоминание об этом, похоже, исчезло из документов Endpoints сейчас, и теперь я вижу способ поменять токены в API-интерфейсе.

4b9b3361

Ответ 1

Я вижу, что у вас есть "com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID" в кавычках. Если это не опечатка в вашей транскрипции в Stack Overflow, это проблема. Значение уже является строкой, поэтому вы просто передаете текст com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID (а не фактический идентификатор клиента) как область с белым списком. Это не сработает. Вместо этого попробуйте:

@ApiMethod(name = "config.get",
        clientIds = {"[MY_CLIENT_ID].apps.googleusercontent.com", com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID},
        audiences = {"[MY_APP_ID].appspot.com"},
        scopes = {"https://www.googleapis.com/auth/userinfo.email"})

Изменить: isUserAdmin не поддерживается в конечных точках и, вероятно, является вторичной причиной ошибки. Я предлагаю подать запрос функции для поддержки этого метода на предоставленном объекте пользователя (мы, скорее всего, не предоставим поддержку самой службе пользователя, поэтому он будет отделен от входа в систему OAuth.)

Ответ 2

Я не знаю, когда это было введено, но если вы используете OAuth2, вместо UserService.isUserAdmin() вы можете использовать OAuthServiceFactory.getOAuthService().isUserAdmin(EMAIL_SCOPE), где EMAIL_SCOPE есть https://www.googleapis.com/auth/userinfo.email".

Это упрощает использование старого OpenId или OAUth2:

boolean isAdmin = false;
try {
  isAdmin = userService.isUserAdmin());
} catch (IllegalStateException e1) {
  try {
    isAdmin = OAuthServiceFactory.getOAuthService().isUserAdmin(EMAIL_SCOPE);
  } catch (Exception e2) {}
}

Оригинальный вопрос задавался несколько лет назад, но, возможно, это поможет другим.