2015-05-21 40 views
17

我使用以下來獲取身份驗證,以便我可以從Android應用程序訪問後端。這裏描述的是https://developers.google.com/identity/protocols/CrossClientAuthGoogleAuthUtil.getToken返回無效的驗證碼

StringBuffer sb = new StringBuffer(); 
sb.append("oauth2:server:client_id:"); 
sb.append(getString(R.string.google_app_id)); 
sb.append(":api_scope:"); 
sb.append("profile email"); 
final String scope = sb.toString(); 
String token = GoogleAuthUtil.getToken(Activity.this, mAuthAccount, scope); 

(mAuthAccount先前使用AccountPicker.newChooseAccountIntent設定)

上述返回有時期滿的短暫認證碼。我想檢查它對谷歌服務器,但調用https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=與返回的來自GoogleAuthUtil.getToken的令牌字符串返回「無效令牌」。

在我嘗試使用它之前,如何驗證驗證代碼未過期?

編輯:返回的字符串不是一個標記,而是一個授權代碼,可以與谷歌API交換獲得一個標記(返回的字符串以「/ 4」開頭,而不是「/ 1」或「/ 2 「如果我沒記錯的話)。

該代碼並不總是工作(在我的服務器上),我希望能夠檢查代碼是否可以使用或已過期。

+0

結帳這樣的回答:http://stackoverflow.com/a/24982688/1484779 – jlopez

+0

我得到{ 「錯誤」:在調用GoogleAuthUtil.getToken之後,https://www.googleapis.com/oauth2/v1/tokeninfo中的「invalid_token」} - 標記只是*生成的,並沒有調和。也許該令牌的類型是錯誤的? – wojciii

+0

此外,我試圖使標記無效並再次調用GoogleAuthUtil.getToken()。我仍然收到來自googleapis.com的無效令牌回覆。這是我不明白的。我想知道我做錯了什麼。 – wojciii

回答

0

正如你可以Validating the token文件看到:

https://www.googleapis.com/oauth2/v1/tokeninfo

接受一個訪問令牌,並返回有關訪問 標誌包括在它發佈到應用程序的信息,令牌的預期 目標,用戶同意的範圍,令牌的剩餘壽命以及用戶ID。

下面是這種請求的一個示例:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg 

的TokenInfo端點將具有JSON陣列描述令牌或錯誤響應。

在電線,響應類似於以下內容:

{ 
    "audience":"8819981768.apps.googleusercontent.com", 
    "user_id":"123456789", 
    "scope":"profile email", 
    "expires_in":436 
} 

如果令牌已過期,已被篡改,或 撤銷的權限,但谷歌授權服務器會響應錯誤。 的誤差表面爲400狀態碼,和JSON體如下:

{"error":"invalid_token"} 

通過設計,沒有附加信息被給定爲爲失敗的原因。

所以invalid_token是當令牌已過期有效的答案,已被篡改,或許可被撤銷

編輯

它可以接收invalid_token返回令牌剛過從GoogleAuthUtil.getToken,因爲GoogleAuthUtil可能已經緩存了它。在這種情況下,您應該撥打GoogleAuthUtil.invalidateToken

你可以在這裏找到更多的信息: http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html

EDIT 2

我剛纔注意到你在你的範圍失蹤https://www.googleapis.com/auth/plus.login。請嘗試添加它,因爲似乎必須使用跨客戶端身份。

+0

我使用「https://www.googleapis.com/auth/plus.login」作爲範圍的一部分。根據https://www.googleapis.com/oauth2/v1/tokeninfo?access_token= ,返回的令牌(字符串)始終無效。我也發現https://github.com/googledrive/crossclientoauth2-android應該是一個工作的例子。 – wojciii

+0

我只在發佈的代碼中看到'profile email' as'api_scope'。你可以用你最近的修改更新你的代碼嗎? –

2

你並不需要使用app_id得到OAuth令牌,你只需要改變範圍

"oauth2:" + Scopes.PLUS_LOGIN 

在這種情況下,你的範圍可以plus.login

更多信息:

Authorizing with Google for REST APIs

Scopes Class

+0

我沒有得到令牌。我得到一個短暫的身份驗證代碼。怎樣才能獲得相同的代碼可以兩次? – wojciii

0

以這種方式由GoogleAuthUtil.getToken()檢索到的令牌不是訪問令牌,它是一個ID令牌。

試試下面的網址,而不是(注意id_token查詢參數,而不是access_token):

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=<ID TOKEN>