Dzm*_*rka 4 google-api oauth-2.0 google-api-java-client android-authenticator
我有一个Google接受的有效OAuth2令牌,但GoogleIdTokenVerifier甚至无法解析它.
令牌是ya29.1.AADtN_XcjzHgauKetBvrbgHImGFg1pjiHRQAKHyTglBDjEZsTPUMQJ5p-xAKtk955_4r6MdnTe3HZ08
(不用担心,它已经过期).
它是在Android上使用获得的
accountManager.blockingGetAuthToken(account, "oauth2:https://www.googleapis.com/auth/userinfo.email", true);
Run Code Online (Sandbox Code Playgroud)
当我打电话给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": "me@gmail.com",
"verified_email": true,
"access_type": "offline"
}
Run Code Online (Sandbox Code Playgroud)
所以它必须是有效的令牌.但是当我打电话时
new GoogleIdTokenVerifier(new UrlFetchTransport(), JacksonFactory.getDefaultInstance())
.verify(authToken)
Run Code Online (Sandbox Code Playgroud)
它给了我
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('É' (code 201)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: java.io.ByteArrayInputStream@69886979; 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)
Run Code Online (Sandbox Code Playgroud)
通过调试JsonWebSignature,似乎令牌有效负载就是1
.
我做错了什么?那里有不同的令牌格式吗?
小智 6
确实存在不同的令牌格式.
您拥有的OAuth2令牌是access_token
- 它表示您的软件已获得您所请求范围的授权,但它没有说明哪个用户实际发出请求.
GoogleIdTokenVerifier
期望验证的还有另一种类型的令牌:OpenID Connect id_token
.许多服务使用那个,因为这意味着某些第三方正在验证您正在查看的流量来自该人(或多或少!).
还有更多的一些背景这里,但短期的版本是,你应该考虑使用[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
.
我知道这个答案可能为时已晚,无法帮助你:)
归档时间: |
|
查看次数: |
889 次 |
最近记录: |