验证服务器上GoogleAuthUtil.getToken()Google+上的令牌时的OAuth2ErrorException invalid_token

时间:2014-07-20 17:09:37

标签: android api google-plus google-authentication

首次使用Google+ API。我有一个使用G +进行身份验证的Web和Android客户端的应用程序。 Web客户端运行良好。我有一个" Web应用程序的客户端ID"在Google API控制台中设置,我用它来获取带有javascript客户端的令牌。

javascript客户端使用以下按钮(基本上逐字逐句地从Google演示应用程序中获取):

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

我在Python服务器上验证:

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

到目前为止一切顺利。令牌按预期验证。

现在为Android应用程序...我为Android应用程序设置了一个&#34;客户端ID&#34;对于具有由以下项生成的调试指纹的同一项目: keytool -exportcert -alias androiddebugkey -keystore debug.keystore -list -v

客户端ID名称的包与我的Android清单中的内容匹配。

我使用GoogleAuthUtil在我的Android应用中生成令牌:

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

如果我使用我新创建的Android应用客户端ID,我会得到: GoogleAuthException:com.google.android.gms.auth.GoogleAuthException:Unknown

我还没想出那个,但是有些解决方案暗示我应该只使用Web应用程序客户端ID并且Exception按预期工作。

如果我使用我的Web应用程序客户端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)

我已经验证到达服务器的令牌与在应用程序中获取的令牌相同(没有杂散的空白等)。

任何想法我做错了什么?谢谢你的任何建议!

1 个答案:

答案 0 :(得分: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是 web 客户端ID。

这会产生更长的令牌。您可以通过以下方式解密/验证此令牌:

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

请注意,查询参数键是 id_token ,而不是access_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 /电子邮件是否已获得授权
  3. 然后继续进行请求处理。

    此解决方案混合了其他StackExchange讨论和本教程的信息: http://android-developers.blogspot.com/2013/01/verifying-back-end-calls-from-android.html

    希望这能节省一些时间!