2013-04-21 9 views
14

私は、App EngineにエンドポイントAPIをデプロイしています。 Google API Explorerを使用して、ログインする必要のないAPIメソッドへのリクエストに問題はありません。私が使用しているURLは次のとおりです。Google API Explorerを使用して、OAuthを使用して自分のApp Engineエンドポイントをテストするにはどうすればよいですか?

https://developers.google.com/apis-explorer

@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メソッドを呼び出して立ち往生しています/?base=https://[MY_APP_ID].appspot.com/_ah/api

は、この一つとして、ログインします

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." 
} 
} 

エンドポイントは、信頼できるテスターのフェーズにいたとき、私は覚えてそこのOAuth2遊び場での手動ステップは、アクセストークンまたは一部のようなもののトークンの代わりにIDを取得すること。それが依然として必要な場合は、そのことについての言及がEndpointsのドキュメントから消えているように見えます。また、APIエクスプローラでトークンを交換する方法もあります。

+0

ああ、OAuthプレイグラウンド(https://developers.google.com/oauthplayground)をAPIコンソールのリダイレクトURIのリストに追加しました。 – Eliot

答えて

12

が引用符で囲まれています。それがスタックオーバーフローへのあなたの転写のタイプミスでないなら、それは問題です。値は既に文字列であるため、文字列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ログインとは別です)。

+0

良いスポッティング!それを修正して再配備しましたが、それは何の違いも生じていないようです。確かに壊れていたが、何か別のものが壊れていた。 – Eliot

+0

ほとんど同じサンプルコードを使用してこの問題を再現することはできません。最初の質問のコードは現在使用しているものですか? OAuthRequestExceptionにマップする必要がある401の代わりに503を取得しているのが不思議です(このテストを自分でテストすると401が表示されます)。 –

+0

これは間違いなく展開されているものです。私がログインしないでこの方法を打つと、あなたのような401が得られます。 APIエクスプローラのOAuth2ボタンを使用してログインしてもう一度ヒットすると、503が返されます。ただし、別の* Endpointsメソッドを使用した場合は、ログインする必要がありますが、 App Engine UserServiceの機能は正常に動作します。エンドポイントでUserService.isUserAdmin()などのものを使用できませんか? OAuthアクセストークンではなく、HTTPセッションに基づいていると思われますか? – Eliot

0

これはいつが導入されましたが、UserService.isUserAdmin()の代わりにOAuth2を使用する場合はOAuthServiceFactory.getOAuthService().isUserAdmin(EMAIL_SCOPE)を使用できます。ここで、EMAIL_SCOPEは "https://www.googleapis.com/auth/userinfo.email"です。元の質問は、数年前に頼まれましたが、多分これは他の人を助ける

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

これにより、簡単に古いOpenIDのかのOAuth2を使用できるようになります。

関連する問題