【问题标题】:GoogleAuthUtil.getToken returns invalid authentication codeGoogleAuthUtil.getToken 返回无效的验证码
【发布时间】:2015-08-03 14:45:28
【问题描述】:

我使用以下内容来获得可以从 Android 应用访问后端的身份验证。这在此处进行了描述https://developers.google.com/identity/protocols/CrossClientAuth

StringBuffer sb = new StringBuffer();
sb.append("oauth2:server:client_id:");
sb.append(getString(R.string.google_app_id));
sb.append(":api_scope:");
sb.append("profile email");
final String scope = sb.toString();
String token = GoogleAuthUtil.getToken(Activity.this, mAuthAccount, scope);

(mAuthAccount 之前是使用 AccountPicker.newChooseAccountIntent 设置的。)

上面返回一个短暂的验证码,有时已经过期。我想对照谷歌服务器检查它,但使用从 GoogleAuthUtil.getToken 返回的令牌字符串调用 https://www.googleapis.com/oauth2/v1/tokeninfo?access_token= 会返回“无效令牌”。

在我尝试使用之前如何验证验证码没有过期?

编辑:返回的字符串不是令牌,而是可以与google API交换以获得令牌的授权码(返回的字符串以“/4”开头,而不是“/1”或“/2”如果我没记错的话)。

代码并不总是有效(在我的服务器上),我希望能够检查代码是否可以使用或已过期。

【问题讨论】:

  • 我在调用 GoogleAuthUtil.getToken 后从googleapis.com/oauth2/v1/tokeninfo 得到 {"error":"invalid_token"} - 令牌只是 生成而不是经过调整。可能是token的类型不对?
  • 另外,我尝试使令牌无效并再次调用 GoogleAuthUtil.getToken()。我仍然收到来自 googleapis.com 的无效令牌回复。这是我不明白的。我想知道我做错了什么。
  • 您的问题解决了吗?你的问题是什么?

标签: android access-token


【解决方案1】:

正如您在Validating the token 文档中看到的那样:

https://www.googleapis.com/oauth2/v1/tokeninfo

接受访问令牌并返回有关该访问的信息 令牌,包括它是发给哪个应用程序的,预期的 令牌的目标,用户同意的范围,其余 令牌的生命周期和用户 ID。

以下是此类请求的示例:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg

TokenInfo 端点将使用描述令牌或错误的 JSON 数组进行响应。

在网络上,响应类似于以下内容:

{
  "audience":"8819981768.apps.googleusercontent.com",
  "user_id":"123456789",
  "scope":"profile email",
  "expires_in":436
}

如果令牌已过期、已被篡改或权限 撤销后,Google 授权服务器将响应错误。 错误显示为 400 状态代码和 JSON 正文,如下所示:

{"error":"invalid_token"}

根据设计,没有提供有关失败原因的其他信息。

所以invalid_token 是令牌过期、被篡改或权限被撤销时的有效答案

编辑

可以在令牌从GoogleAuthUtil.getToken 返回后收到invalid_token,因为GoogleAuthUtil 可能已经缓存了它。在这种情况下,您应该致电GoogleAuthUtil.invalidateToken

您可以在此处找到更多信息: http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html

编辑 2

我只是注意到您的范围内缺少https://www.googleapis.com/auth/plus.login。请尝试添加它,因为似乎必须使用跨客户端身份。

【讨论】:

【解决方案2】:

你不需要使用app_id来获取oauth令牌,你只需要改变范围

"oauth2:" + Scopes.PLUS_LOGIN

在这种情况下,您的范围可以是 plus.login

更多信息:

Authorizing with Google for REST APIs

Scopes Class

【讨论】:

  • 我没有收到令牌。我得到一个短暂的身份验证码。怎么可能两次获得相同的代码?
【解决方案3】:

GoogleAuthUtil.getToken() 以这种方式检索到的令牌不是访问令牌,而是 ID 令牌。

尝试使用以下 URL(注意 id_token 查询参数而不是 access_token):

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=<ID TOKEN>

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 2014-01-02
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多