2014-07-20 4 views
3

처음 Google+ API를 사용 중입니다. 인증에 G +를 사용하는 웹 및 Android 클라이언트가있는 애플리케이션이 있습니다. 웹 클라이언트가 잘 작동합니다. 자바 API 클라이언트에서 토큰을 가져 오는 데 사용하는 Google API 콘솔에 "웹 응용 프로그램의 클라이언트 ID"가 설정되어 있습니다.GoogleAuthUtil.getToken()에서 토큰을 확인할 때 OAuth2ErrorException invalid_token 서버의 Google+

url = ('https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=%s' % token) 
h = httplib2.Http() 
    result = json.loads(h.request(url, 'GET')[1]) 
:

<button class="g-signin" 
     data-scope="https://www.googleapis.com/auth/plus.login" 
     data-requestvisibleactions="http://schemas.google.com/AddActivity" 
     data-clientId="my_web_application_client_id" 
     data-callback="onSignInCallback" 
     data-theme="dark" 
     data-cookiepolicy="single_host_origin"> 

내가 함께 파이썬 서버에서 확인 :

자바 스크립트 클라이언트는 (구글 데모 애플리케이션에서 기본적으로 그대로 촬영) 다음과 같은 버튼을 사용하여

지금까지 너무 좋아. 토큰이 예상대로 확인됩니다. 키 도구 -exportcert -alias androiddebugkey -keystore하게 debug.keystore -list -v :

이제 안드로이드 앱 ... 나는에 의해 생성 된 디버그 지문과 같은 프로젝트에 대해 "안드로이드 응용 프로그램 클라이언트 ID"를 설정

클라이언트 ID 이름의 패키지가 내 Android 매니페스트의 패키지와 일치합니다. 내 안드로이드 응용 프로그램에서 토큰을 생성하는 GoogleAuthUtil을 사용하고

:

String token = 
    GoogleAuthUtil.getToken(
    this, 
    "[email protected]", 
    "oauth2:server:client_id:<client_id>:" + 
     "api_scope:https://www.googleapis.com/auth/plus.login"); 

내가 내 새로 생성 된 안드로이드 응용 프로그램 클라이언트 ID를 사용하는 경우, 내가 얻을 : GoogleAuthException : com.google.android합니다. gms.auth.GoogleAuthException : 알 수 없음

아직 해결되지 않았지만 몇 가지 해결책은 웹 응용 프로그램 클라이언트 ID를 사용해야한다는 것과 예외가 의도 한대로 작동한다는 것입니다.

나는 내 웹 응용 프로그램 클라이언트 ID를 사용하는 경우

후 모든 것이 잘 작동하는 나타나고 토큰이 반환됩니다,하지만 난 확인하기 위해 내 서버에 토큰을 보낼 때, 토큰이 거부됩니다 :

{u'error_description': u'Invalid Value', u'debug_info': u'code: INVALID_VALUE 
http status: 400 
arguments: [invalid_token] 
cause: com.google.security.lso.protocol.oauth2.common.OAuth2ErrorException:\ 
invalid_token at 
com.google.security.lso.grant.token.TokenManager.getTokenInfo(TokenManager.java:603) at 
com.google.security.lso.apiary.tokeninfo.TokenInfoAction.execute(TokenInfoAction.java:92) 

서버에 도착하는 토큰이 앱에서 가져온 토큰과 동일하다는 것을 확인했습니다 (잘못된 공백 없음 등).

내가 잘못하고있는 아이디어가 있습니까? 어떤 제안을 주셔서 감사합니다!

답변

2

내가하고 결국 것은 다음

대신 다음과 같은 범위의, GoogleAuthUtil 전화 :

oauth2:server:client_id:<client_id>:api_scope:https://www.googleapis.com/auth/plus.login 

내가 사용 :

audience:server:client_id:<client_id> 

여기서 client_id는 클라이언트 ID입니다.

이렇게하면 훨씬 긴 토큰이 생성됩니다.당신은/암호 해독을 통해이 토큰을 인증 할 수 있습니다 : 쿼리 PARAM 키 access_token은하지 id_token 것을

https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=<token> 

참고.

서버는 다음과 같이 응답 : 서버에

{ 
"issuer": "accounts.google.com", 
"issued_to": "<android_client_id>", 
"audience": "<web_client_id>", 
"user_id": "<some_long_integer>", 
"expires_in": 3354, 
"issued_at": 1406474776, 
"email": "<email address passed to GaiaAuthUtil>", 
"verified_email": true 
} 

, 당신은 그 때 :

  1. 관객과 issued_to 문자열이
  2. 이 확인 기대 있는지 확인 사용자 ID/전자 메일이 승인되었습니다.

그런 다음 요청 처리를 수행합니다. 이 사람이 시간을 절약 할 수 http://android-developers.blogspot.com/2013/01/verifying-back-end-calls-from-android.html

희망 :

이 솔루션은 다른 StackExchange 토론에서 정보의 혼합물이 튜토리얼입니다!

관련 문제