3

我收到了Google接受的有效OAuth2令牌,但GoogleIdTokenVerifier甚至無法解析它。有效的Google OAuth2令牌無法解析?

令牌是ya29.1.AADtN_XcjzHgauKetBvrbgHImGFg1pjiHRQAKHyTglBDjEZsTPUMQJ5p-xAKtk955_4r6MdnTe3HZ08(不用擔心,它已經過期)。

它使用

accountManager.blockingGetAuthToken(account, "oauth2:https://www.googleapis.com/auth/userinfo.email", true); 

當我打電話https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=... 我得到這樣

{ 
    "issued_to": "34951113407.apps.googleusercontent.com", 
    "audience": "34951113407.apps.googleusercontent.com", 
    "scope": "https://www.googleapis.com/auth/userinfo.email", 
    "expires_in": 3175, 
    "email": "[email protected]", 
    "verified_email": true, 
    "access_type": "offline" 
} 

理智的結果,所以它必須是一個有效令牌在Android上獲得的。 但是,當我打電話

new GoogleIdTokenVerifier(new UrlFetchTransport(), JacksonFactory.getDefaultInstance()) 
    .verify(authToken) 

它給了我

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('É' (code 201)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') 
at [Source: [email protected]; line: 1, column: 2] 
    at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1378) 
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:599) 
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:520) 
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2275) 
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:788) 
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:674) 
    at com.google.api.client.json.jackson2.JacksonParser.nextToken(JacksonParser.java:55) 
    at com.google.api.client.json.JsonParser.startParsing(JsonParser.java:213) 
    at com.google.api.client.json.JsonParser.parse(JsonParser.java:372) 
    at com.google.api.client.json.JsonParser.parse(JsonParser.java:328) 
    at com.google.api.client.json.JsonParser.parseAndClose(JsonParser.java:158) 
    at com.google.api.client.json.JsonParser.parseAndClose(JsonParser.java:140) 
    at com.google.api.client.json.JsonFactory.fromInputStream(JsonFactory.java:206) 
    at com.google.api.client.json.webtoken.JsonWebSignature$Parser.parse(JsonWebSignature.java:480) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.parse(GoogleIdToken.java:57) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier.verify(GoogleIdTokenVerifier.java:190) 

通過調試JsonWebSignature似乎令牌有效載荷僅僅是1

  • 的Android 4.4.2
  • com.google.http客戶端:谷歌-HTTP-客戶jackson2:1.17.0-RC
  • com.fasterxml.jackson.core:傑克遜 - 芯:2.3 .0(也試過包含google-http-client-jackson的臨時依賴2.1.3) 也試過GsonFactory,異常是不同的,但也明顯無法通過JsonWebSignature.parse()解析。

我做錯了什麼?那裏有不同的令牌格式嗎?

回答

5

確實存在不同的標記格式。

您在那裏獲得的OAuth2令牌是access_token - 它表示您的軟件已獲得您所請求範圍的授權,但並未說明哪些用戶實際上正在提出請求。

還有另一種類型的令牌GoogleIdTokenVerifier預計驗證:一個OpenID Connect id_token。很多服務都使用該服務,因爲這意味着某些第三方正在驗證您正在查看的流量來自該人(或多或少!)。

還有更多的一些背景here,但短期的版本是,你應該考慮使用[GoogleAuthUtil#爲gettoken(android.content.Context,java.lang.String中,java.lang.String中)(https://developers.google.com/android/reference/com/google/android/gms/auth/GoogleAuthUtil#getToken(android.content.Context,JAVA。 lang.String,java.lang.String中)) - 它會返回id_token做琴絃 - 要不考慮到底是哪作用域需要,並考慮要求openid範圍,而不是當前oauth2:https://www.googleapis.com/auth/userinfo.email的。

我知道這個答案可能來不及幫助你:)

+0

謝謝。是的,我已在[我的應用](https://github.com/dlazerka/mf)中切換到[Google登錄](https://developers.google.com/identity/sign-in/android/) /blob/master/android/src/main/java/me/lazerka/mf/android/auth/SignInManager.java),這似乎是目前推薦的方法。 –

相關問題