android - 在服务器上的 GoogleAuthUtil.getToken() Google+ 上验证 token 时出现 OAuth2ErrorException invalid_token

标签 android api google-plus google-authentication

第一次使用 Google+ API。我有一个带有 Web 和 Android 客户端的应用程序,该客户端使用 G+ 进行身份验证。 Web 客户端运行良好。我在 Google API 控制台中设置了一个“Web 应用程序的客户端 ID”,我用它来通过 JavaScript 客户端获取 token 。

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])

到目前为止一切顺利。 token 按预期进行验证。

现在对于 android 应用程序...我为同一个项目设置了一个“Android 应用程序的客户端 ID”,并使用以下方式生成的调试指纹: keytool -exportcert -alias androiddebugkey -keystore debug.keystore -list -v

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

我正在使用 GoogleAuthUtil 在我的 Android 应用中生成 token :

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:未知

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

如果我使用我的 Web 应用程序客户端 ID,那么一切似乎都工作正常并返回一个 token ,但是当我将 token 发送到我的服务器进行验证时, token 被拒绝:

{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)

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

知道我做错了什么吗?感谢您的任何建议!

最佳答案

我最后做了以下事情:

调用 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。

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

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. 验证 audience 和 issued_to 字符串是否符合您的预期
  2. 验证用户名/电子邮件已获得授权

然后继续处理请求。

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

希望这会节省一些时间!

关于android - 在服务器上的 GoogleAuthUtil.getToken() Google+ 上验证 token 时出现 OAuth2ErrorException invalid_token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24852882/

相关文章:

java - 访问使用 POSTMAN 运行良好的 Web API 时出错

json - 来自 REST API 的 JSON 响应是否应该进行 url 编码?

java - 自定义Action Bar如何实现?

android - 如何在 vmware 上安装 genymotion

ruby-on-rails - 使用 token 对 API 进行身份验证

javascript - gapi.client未定义-Firefox附加SDK

cordova - 在 PhoneGap 中使用 Googleplus 签名

android - 如何在android中获取google plus的刷新 token ?

java - 设置值后 SharedPreferences 返回默认值

android - 当 TTS 语言与系统语言不同时激活辅助功能服务