3

나는 유효한 OAuth2를 구글이 수락하는 토큰을 가지고 있지만, GoogleIdTokenVerifier는 심지어 그것을 구문 분석 할 수 없습니다.유효한 Google OAuth2 토큰을 파싱 할 수 없습니까?

토큰은 (이미 만료 걱정 것) ya29.1.AADtN_XcjzHgauKetBvrbgHImGFg1pjiHRQAKHyTglBDjEZsTPUMQJ5p-xAKtk955_4r6MdnTe3HZ08 없습니다.

그것은 내가 그래서 유효한 토큰해야

{ 
    "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" 
} 

처럼 제정신 결과를 얻을 수 https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=... 를 호출 할 때

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

사용하여 안드로이드에 얻을 수 있습니다. 하지만

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

를 호출 할 때 그것은 JsonWebSignature을 디버깅하여 나에게

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) 

을 제공 토큰 페이로드 그냥 1 것 같다.

  • 안드로이드 4.4.2
  • com.google.http 클라이언트 : 구글-HTTP-클라이언트 jackson2 : 1.17.0-RC를
  • com.fasterxml.jackson.core : 잭슨 코어 : 2.3 0.0 또한 시도 GsonFactory (또한 시도는 구글-HTTP-클라이언트 잭슨의 과도 의존성에서 2.1.3 포함), 예외가 다른뿐만 아니라 명확하게 JsonWebSignature.parse에 의해 구문 분석 할 수 없습니다(). 내가 뭘 잘못했는지

? 거기에 다른 토큰 형식이 있습니까?

답변

5

다른 토큰이 거기 포맷 사실이 있습니다.

당신이 가지고있는 OAuth2 토큰은 access_token입니다. 귀하의 소프트웨어는 귀하가 요청한 범위로 승인 받았으나 실제로 어떤 사용자가 실제로 요청했는지는 밝히지 않았습니다.

GoogleIdTokenVerifier이 검증하기를 기대하는 또 다른 유형의 토큰 인 OpenID Connect id_token이 있습니다. 많은 서비스가 그 중 하나를 사용합니다. 왜냐하면 어떤 제 3자가 당신이보고있는 트래픽이 그 사람의 것으로 온 것임을 인증하기 때문입니다 (다소간!).

좀 더 배경 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, 자바를 사용하는 것이 좋습니다 것입니다. lang.String, java.lang.String의)) -이 String로서 id_token를 반환합니다 - 그렇지 않으면 당신이 필요로 스코프을 정확하게 고려, 현재 oauth2:https://www.googleapis.com/auth/userinfo.email 대신 openid 범위를 요청하는 것이 좋습니다.

나는이 대답이 아마도 당신을 도울 수 있다는 것을 알고 있습니다.

+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), 현재 권장되는 접근 방법 인 것 같습니다. –

관련 문제