【问题标题】:Valid Google OAuth2 token unparseable?有效的 Google OAuth2 令牌无法解析?
【发布时间】:2014-03-17 17:15:39
【问题描述】:

我有一个 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。

  • Android 4.4.2
  • com.google.http-client:google-http-client-jackson2:1.17.0-rc
  • com.fasterxml.jackson.core:jackson-core:2.3.0(也尝试从 google-http-client-jackson 的瞬时依赖项中包含 2.1.3) 也试过GsonFactory,异常不同,但也明显不能被JsonWebSignature.parse()解析。

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

【问题讨论】:

    标签: oauth-2.0 google-api google-api-java-client android-authenticator


    【解决方案1】:

    确实有不同的令牌格式。

    您拥有的 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 范围而不是当前的@ 987654330@.

    我知道这个答案可能为时已晚,无法帮助您:)

    【讨论】:

    • 谢谢。是的,我已经在my app 中切换到Google Sign In,这似乎是当前推荐的方法。
    猜你喜欢
    • 2013-05-02
    • 2014-05-31
    • 1970-01-01
    • 2017-03-09
    • 2021-12-17
    • 1970-01-01
    • 2021-08-27
    • 2012-06-08
    • 2017-03-22
    相关资源
    最近更新 更多