2

YouTubeでIMOの役立つGDLエピソードを見た後、最近、アプリエンジンアプリケーションをリファクタリングしてクラウドエンドポイントをサポートすることができました。

javascriptクライアントを使用してサイトをテストし、承認を処理してから、ほとんど機能するアイテムのリストを返します。しかし、エンドポイントを呼び出してアイテムのリストを返すと、AppEngineログに次の一連のエラーが記録されます。

I 2013-03-14 08:52:14.748 Checking for id_token.
W 2013-03-14 08:52:14.748 id_token verification failed: Wrong number of segments in token: ya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE
I 2013-03-14 08:52:14.748 Checking for oauth token.
W 2013-03-14 08:52:14.885 Found 1 RPC request(s) without matching response (presumably due to timeouts or other errors)

私が知ることができることから、グーグルが返しているすべての認証トークンには3つではなく2つの「セグメント」しかないので、これが何を意味するのかわかりません。

ブラウザコンソールからの承認リクエストヘッダーは次のとおりです。承認ベアラーya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE

どんな助けでもいただければ幸いです。

4

1 に答える 1

8

トークンには、ID トークンと標準ベアラー トークンの 2 種類があります。

無記名トークン:

これは、OAuth ダンスを通じて取得される標準のトークンです。

ID トークン:

典型的な ID トークンは次のように eyJhbGciOiJSUzI1NiIsImtpZCI6IjIxZWFlMTVkODE.eyJpc3MiOiJhY2NvdW50cy5n.oXLawgz_ed なり (かなり長いセグメントを除く)、署名付き JWT です。

ID トークンは'id_token'、Tic-Tac-Toeサンプルで行われているように、レスポンス タイプに追加することで JavaScript で取得できます。

このように、 OAuth リクエストから返されるトークンにも ID トークンが含まれます。

var token = gapi.auth.getToken();
// Use id_token instead of bearer token
token.access_token = token.id_token;    

ログに表示される内容:

この線

W 2013-03-14 08:52:14.748 id_token verification failed: Wrong number of segments in token: ya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE

ya29.AHE...これは、監視されたトークンが ID トークンではなく、ログの次の行であることを意味する単なる警告です。

I 2013-03-14 08:52:14.748 Checking for oauth token.

トークンが Bearer Token であるかどうかを確認するために移動していることを意味します。

これはトークンが無効であることを意味するのではなく、Bearer Token をチェックしていたということです

この線

W 2013-03-14 08:52:14.885 Found 1 RPC request(s) without matching response (presumably due to timeouts or other errors)

おそらく失敗したトークンを検証するための RPC があったことを意味します。Bearer Token を検証するための主な要素は、

oauth.get_current_user(EMAIL_SCOPE)

とリクエスト

https://www.googleapis.com/oauth2/v2/tokeninfo?access_token=ya29.AHE...

トークンのクライアント ID とオーディエンスを確認します。

ID トークンの詳細:

最初のセグメントは、base64url でエンコードされた、使用されている暗号化の説明です。例えば。

>>> import base64, json
>>> segments = id_token.split('.')
>>> first_segment = segments[0] + '=' * ((4 - len(segments[0])) % 4)
>>> json.loads(base64.urlsafe_b64decode(first_segment))
{u'alg': u'RS256', u'kid': u'21eae15d817c1b4a8f6ff4501930512d07cbe684'}

2 番目のセグメントは、トークンのコンテンツの base64url エンコードされた説明です。

>>> second_segment = segments[1] + '=' * ((4 - len(segments[0])) % 4)
>>> base64.urlsafe_b64decode(second_segment)
{u'at_hash': u'xxxyyyzzz',  # Fake Data
 u'aud': u'someclient_id.apps.googleusercontent.com',
 u'azp': u'someclient_id.apps.googleusercontent.com',
 u'cid': u'someclient_id.apps.googleusercontent.com',
 u'email': u'joe@mail.com',
 u'email_verified': u'true',
 u'exp': 1363289943,
 u'hd': u'google.com',
 u'iat': 1363286043,
 u'id': u'123456789',  # Fake Data
 u'iss': u'accounts.google.com',
 u'sub': u'123456789',  # Fake Data
 u'token_hash': u'xxxyyyzzz',  # Fake Data
 u'verified_email': u'true'}

3 番目のセグメントは、Google の秘密鍵で署名された最初の 2 つのセグメントの組み合わせです。

于 2013-03-14T19:03:01.933 に答える