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

У меня есть Endpoints 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 вверху справа есть переключатель, при нажатии которого я могу указать области действия и авторизоваться. Я делаю это только с проверкой области 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 был ручной шаг для получения токена идентификатора вместо токена доступа или чего-то подобного. Если это все еще требуется, любое упоминание об этом, похоже, исчезло из документации по конечным точкам, и теперь я также вижу способ замены токенов в проводнике API.


person Eliot    schedule 21.04.2013    source источник
comment
А еще я добавил игровую площадку OAuth (developers.google.com/oauthplayground) в список URI перенаправления в консоли API.   -  person Eliot    schedule 21.04.2013


Ответы (2)


Я вижу, у вас "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).

person Dan Holevoet    schedule 22.04.2013
comment
Хорошая пятнистость! Исправил это и передислоцировал, но, похоже, это не имело никакого значения. Был, конечно, сломан, но есть еще кое-что сломанное. - person Eliot; 25.04.2013
comment
Я не могу воспроизвести эту проблему, используя почти идентичный пример кода. Является ли код в вашем первоначальном вопросе тем, что вы используете сейчас? Любопытно, что вы получаете 503 вместо 401, на что должно сопоставляться OAuthRequestException (я вижу 401, когда проверяю это сам). - person Dan Holevoet; 26.04.2013
comment
Это определенно то, что развернуто. Если я выберу этот метод без входа в систему, я получу 401, как и вы. Если я затем войду в систему с помощью кнопки OAuth2 в проводнике API и снова нажму ее, я получу 503. Однако, если я нажму другой метод конечных точек, который у меня есть, который требует, чтобы пользователь вошел в систему, но НЕ включает использование UserService App Engine, он работает нормально. Могу ли я не использовать такие вещи, как UserService.isUserAdmin() в конечных точках? Предположительно, этот материал по-прежнему основан на сеансах HTTP, а не на токенах доступа OAuth? - person Eliot; 26.04.2013
comment
О, вау, я слепой. Нет, вы не можете использовать isUserAdmin в конечных точках. Если вам нужны функциональные возможности администратора, вам нужно будет управлять ими с помощью собственного ACL. - person Dan Holevoet; 26.04.2013
comment
В ПОРЯДКЕ. Думаю, это имеет смысл. Хотя, может быть, это хорошо для документов. Спасибо за вашу помощь. - person Eliot; 27.04.2013

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

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

person rakensi    schedule 11.12.2015