我最近能够在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)
据我所知,在所有auth令牌中只有2个“段”谷歌返回的不是3,所以我不清楚这意味着什么。
以下是我的浏览器控制台的授权请求标头: 授权持有人ya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE
任何帮助都将不胜感激。
答案 0 :(得分:8)
有两种类型的令牌:ID令牌和标准承载令牌。
这是通过OAuth舞蹈检索的标准代币。
典型的ID令牌看起来像
eyJhbGciOiJSUzI1NiIsImtpZCI6IjIxZWFlMTVkODE.eyJpc3MiOiJhY2NvdW50cy5n.oXLawgz_ed
(除了段长得多)并且是签名的JWT。
通过在响应类型中添加'id_token'
,可以在JavaScript中获取ID令牌,就像在我们的Tic-Tac-Toe sample中所做的那样。
这样,OAuth请求的令牌returned from也将具有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.
表示它正在继续检查令牌是否是承载令牌。
此不会表示您的令牌无效,只是它正在检查承载令牌。
该行
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和受众。
第一个段是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'}
第三段是前两张用Google私钥签名的组合。