有两种类型的标记:ID令牌和标准承载令牌。
无记号令牌:
这是通过OAuth舞蹈检索到的标准令牌。
ID令牌:
一个典型的ID令牌看起来像 eyJhbGciOiJSUzI1NiIsImtpZCI6IjIxZWFlMTVkODE.eyJpc3MiOiJhY2NvdW50cy5n.oXLawgz_ed
(除了那些长得多段),是一个签署JWT。
通过在响应类型中添加'id_token'
,可以在JavaScript中获得ID令牌,如在我们的井字趾sample中所做的那样。
这种方式,令牌returned from的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.
意味着它移动到检查标记是一个承载令牌。
This DOES NOT表示您的令牌无效,只是它正在检查无记名令牌。
线
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'[email protected]',
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'}
和第三段是与谷歌的私钥签名的前两个的组合。
谢谢bossylobster!并再次感谢您将该GDL放在YouTube上 - 这对于让这些东西起作用是一个很好的快速入门者。 – earthtrip 2013-03-15 03:46:51
伟大的写作! – alex 2013-06-04 12:49:53
@bossylobster是否有办法在服务器中获取访问代码,以便我可以在服务器中使用它进行调用?我的意思是,在用户使用javascript api进行身份验证后,我想代表服务器中的用户调用Google Plus API。 – 2014-05-20 00:39:08