6

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
  • 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()。

私は何を間違えましたか?さまざまなトークン形式がありますか?

4

1 に答える 1

6

実際、さまざまなトークン形式があります。

そこにある OAuth2 トークンはaccess_token、ソフトウェアが要求したスコープで承認されていることを示していますが、実際に要求を行っているユーザーについては何も示していません。

GoogleIdTokenVerifierが検証することを期待する別のタイプのトークンがあります: OpenID Connectid_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

私はこの答えがあなたを助けるにはおそらく遅すぎることを知っています:)

于 2016-02-05T19:55:12.387 に答える