2

在 YouTube 上观看了 IMO 有用的 GDL 剧集后,我最近能够重构我的应用引擎应用程序以支持 Cloud Endpoints。

我正在使用 javascript 客户端测试我的网站来处理授权,然后返回最有效的项目列表。但是,当我调用端点以返回项目列表时,我的 App Engine 日志中出现了这组错误:

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)

据我所知,谷歌返回的所有身份验证令牌中只有 2 个“段”而不是 3 个,所以我不清楚这意味着什么。

这是来自我的浏览器控制台的授权请求标头: Authorization Bearer ya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE

任何帮助,将不胜感激。

4

1 回答 1

8

有两种类型的令牌:ID 令牌和标准 Bearer 令牌。

承载令牌:

这是通过 OAuth 舞蹈检索到的标准令牌。

身份令牌:

一个典型的 ID 令牌看起来像 eyJhbGciOiJSUzI1NiIsImtpZCI6IjIxZWFlMTVkODE.eyJpc3MiOiJhY2NvdW50cy5n.oXLawgz_ed (除了更长的段)并且是一个签名的 JWT。

可以在 JavaScript 中通过添加'id_token'到响应类型来获得 ID 令牌,就像在我们的井字游戏示例中所做的那样。

这样,从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

只是一个警告,意思是观察到的tokenya29.AHE...不是IDtoken和日志中的下一行

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)

可能意味着有一个 RPC 来验证失败的令牌。验证承载令牌的主要部分是调用

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'}

第二段是令牌内容的 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'}

第三部分是用谷歌私钥签名的前两个部分的组合。

于 2013-03-14T19:03:01.933 回答