Как использовать Google API Explorer для тестирования собственных конечных точек App Engine с помощью 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 есть переключатель сверху правильно, что при нажатии позволяет мне указать области и разрешить. Я делаю это только пользователи.проверена область электронной почты. Это не имеет значения. Ответ, который я получаю от моего звонка:

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 был ручной шаг, чтобы получить маркер ID вместо маркера доступа или чего-то подобного. Если это все еще требуется, любое упоминание об этом, похоже, исчезло из конечных точек docs now и I см. Теперь способ замены токенов в Проводнике API.

2 ответов


вижу "com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID" в кавычках. Если это не опечатка в вашей транскрипции для переполнения стека, это проблема. Значение уже является строкой, поэтому вы просто передаете текст 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.)


Я не знаю, когда это было введено, но если вы используете 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) {}
}

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