GoogleAuthUtil.getToken返回无效的身份验证代码

woj*_*iii 17 android access-token

我使用以下内容来获取可以从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);
Run Code Online (Sandbox Code Playgroud)

(之前使用AccountPicker.newChooseAccountIntent设置了mAuthAccount.)

以上内容返回有时已过期的短期认证代码.我想针对谷歌服务器进行检查,但使用GoogleAuthUtil.getToken返回的令牌字符串调用https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=会返回"无效令牌".

在尝试使用之前,如何验证身份验证代码是否已过期?

编辑:返回的字符串不是令牌,而是授权代码,可以与谷歌API交换以获取令牌(返回的字符串以"/ 4"开头,而不是"/ 1"或"/ 2",如果我记得的话正确).

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

Mat*_*ini 0

正如您在验证令牌文档中看到的:

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

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

以下是此类请求的示例:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg
Run Code Online (Sandbox Code Playgroud)

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

在线路上,响应类似于以下内容:

{
  "audience":"8819981768.apps.googleusercontent.com",
  "user_id":"123456789",
  "scope":"profile email",
  "expires_in":436
}
Run Code Online (Sandbox Code Playgroud)

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

{"error":"invalid_token"}
Run Code Online (Sandbox Code Playgroud)

按照设计,不会提供有关失败原因的附加信息。

invalid_token当令牌过期、被篡改或权限被撤销时,这也是有效的答案

编辑

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

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

编辑2

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