2013-03-14 102 views
2

我只是最近才得以重構我的App Engine應用程序在YouTube上觀看了IMO有益GDL事件之後支持雲端點。雲終端的oauth2錯誤

我使用JavaScript客戶端處理授權,然後返回其主要工作項目列表測試我的網站。但是,當我打電話端點返回的項目列表中我得到這個錯誤集合在我的應用程序引擎的日誌:

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,所以我不清楚這意味着什麼。

下面是從我的瀏覽器控制檯的授權請求報頭: 授權承載ya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE

任何幫助,將不勝感激。

回答

8

有兩種類型的標記: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'} 

和第三段是與谷歌的私鑰簽名的前兩個的組合。

+2

謝謝bossylobster!並再次感謝您將該GDL放在YouTube上 - 這對於讓這些東西起作用是一個很好的快速入門者。 – earthtrip 2013-03-15 03:46:51

+0

偉大的寫作! – alex 2013-06-04 12:49:53

+0

@bossylobster是否有辦法在服務器中獲取訪問代碼,以便我可以在服務器中使用它進行調用?我的意思是,在用戶使用javascript api進行身份驗證後,我想代表服務器中的用戶調用Google Plus API。 – 2014-05-20 00:39:08