14

App Engine にデプロイされた Endpoints API があります。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."
 }
}

Endpoints が Trusted Tester フェーズにあった頃、アクセス トークンなどの代わりに ID トークンを取得するために OAuth2 Playground に手動の手順があったことを覚えています。それがまだ必要な場合、それについての言及はエンドポイントのドキュメントから消えたようで、API Explorer でトークンを交換する方法もわかりました。

4

2 に答える 2

12

引用符で囲まれていることがわかります"com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID"。それが Stack Overflow への転記のタイプミスでない場合、それは問題です。com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID値はすでに文字列であるため、ホワイトリストに登録されたスコープとして (実際のクライアント 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エンドポイント内ではサポートされておらず、エラーの二次的な原因である可能性があります。提供された User オブジェクトでこのメソッドをサポートするための機能リクエストを提出することをお勧めします (ユーザー サービス自体のサポートは提供しない可能性が高いため、OAuth ログインとは別のものです)。

于 2013-04-22T22:00:16.740 に答える
0

これがいつ導入されたのかはわかりませんが、OAuth2 を使用する場合は、代わりにwhere is " https://www.googleapis.com/auth/userinfo.emailUserService.isUserAdmin() "を使用できます。OAuthServiceFactory.getOAuthService().isUserAdmin(EMAIL_SCOPE)EMAIL_SCOPE

これにより、古い OpenId または OAUth2 を簡単に使用できます。

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

元の質問は数年前に尋ねられましたが、おそらくこれは他の人に役立つでしょう.

于 2015-12-11T14:32:41.667 に答える