Oauth 2.0 有效的Google OAuth2令牌不可解析?

Oauth 2.0 有效的Google OAuth2令牌不可解析?,oauth-2.0,google-api,google-api-java-client,android-authenticator,Oauth 2.0,Google Api,Google Api Java Client,Android Authenticator,我有一个Google接受的有效OAuth2令牌,但GoogleIdTokenVerifier甚至无法解析它 代币是ya29.1.AADtN_XcjzHgauKetBvrbgHImGFg1pjiHRQAKHyTglBDjEZsTPUMQJ5p-xAKtk955_4r6MdnTe3HZ08(不用担心,它已经过期了) 它是在Android上使用 accountManager.blockingGetAuthToken(account, "oauth2:https://www.googleapis.com

我有一个Google接受的有效OAuth2令牌,但GoogleIdTokenVerifier甚至无法解析它

代币是ya29.1.AADtN_XcjzHgauKetBvrbgHImGFg1pjiHRQAKHyTglBDjEZsTPUMQJ5p-xAKtk955_4r6MdnTe3HZ08(不用担心,它已经过期了)

它是在Android上使用

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": "me@gmail.com",
  "verified_email": true,
  "access_type": "offline"
}
所以它必须是一个有效的令牌。 但是当我打电话的时候

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: 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)
通过调试JsonWebSignature,令牌负载似乎只是
1

  • 安卓4.4.2
  • http客户端:google-http-client-jackson2:1.17.0-rc
  • com.fasterxml.jackson.core:jackson-core:2.3.0(还尝试从google http客户端jackson的暂时依赖项中包括2.1.3) 同样尝试过GsonFactory,异常是不同的,但显然也不能由JsonWebSignature.parse()解析

我做错了什么?有不同的令牌格式吗?

确实有不同的令牌格式

您拥有的OAuth2令牌是
access\u令牌
——它表示您的软件在您请求的范围内得到了授权,但它没有说明实际是哪个用户发出请求

GoogleIdTokenVerifier
希望验证另一种类型的令牌:OpenID Connect
id\u令牌。很多服务都使用这种方式,因为这意味着某些第三方正在验证您所查看的流量是否来自该用户(或多或少!)

有一点背景,但是简短的版本是你应该考虑使用[GoGoAuthUutul,γGETCONTION(ANDROID.Cord.java,JavaLang.String,java. Lang.String)]((java. Lang.string,java,Lang.String))——它将返回<代码> IDOTIGON/CODE >作为字符串——或者确切地考虑你需要哪些范围,并考虑请求<代码> OpenID <代码>作用域,而不是当前<代码> OAuth2:https://www.googleapis.com/auth/userinfo.email


我知道这个答案对你来说可能太晚了:)

谢谢。是的,我已经切换到in,这似乎是当前推荐的方法。