2013-04-21 9 views
14

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

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 Explorer есть переключатель в правом верхнем углу, который при щелчке позволяет указать области и авторизовать. Я делаю это с проверкой только области 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." 
} 
} 

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

+0

О, и я также добавил игровую площадку OAuth (https://developers.google.com/oauthplayground) в список URI переадресации в консоли API. – Eliot

ответ

12

Я вижу, что у вас есть в кавычках. Если это не опечатка в вашей транскрипции в 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"}) 

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

+0

Хорошее пятно! Исправили это и перераспределили, но это, похоже, не имело никакого значения. Был, конечно, сломан, но есть что-то еще сломанное. – Eliot

+0

Я не могу воспроизвести эту проблему, используя почти идентичный пример кода. Является ли код в вашем первоначальном вопросе, что вы используете сейчас? Любопытно, что вы получаете 503 вместо 401, что и должно отображаться OAuthRequestException (я вижу 401, когда я сам это тестирую). –

+0

Это определенно то, что развернуто. Если я удалю этот метод, не войдя в систему, я получу 401, как вы. Если я вхожу в систему с помощью кнопки OAuth2 в API-интерфейсе API и снова удаляю ее, я получаю 503. Однако, если я удалю * другой метод * Endpoints, который у меня есть, который требует, чтобы пользователь вошел в систему, но НЕ включает никакого использования UserService App Engine, он отлично работает. Могу ли я использовать такие объекты, как UserService.isUserAdmin() в конечных точках? Предположительно, этот материал по-прежнему основан на сеансах HTTP, а не на токенах доступа OAuth? – Eliot

0

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

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

Смежные вопросы