GoogleAuthUtil.getToken返回无效的validation码

我使用以下来获得身份validation,我可以从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); 

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

以上返回一个短暂的validation代码,有时已经过期。 我想检查它对谷歌服务器,但调用https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=与从GoogleAuthUtil.getToken返回的标记string返回“无效标记”。

在尝试使用之前,如何validationauthentication码尚未过期?

编辑:返回的string不是一个令牌,而是一个授权码,可以与谷歌API交换获得一个令牌(如果我记得返回的string以“/ 4”开头而不是“/ 1”或“/ 2”正确)。

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

Solutions Collecting From Web of "GoogleAuthUtil.getToken返回无效的validation码"

你不需要使用app_id来获得oauth标记,你只需要改变范围

 "oauth2:" + Scopes.PLUS_LOGIN 

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

更多信息:

向Google授权REST API

范围类

正如您在validation令牌文档中所看到的:

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

在devise上,没有提供关于故障原因的附加信息。

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

编辑

GoogleAuthUtil.getToken返回令牌之后,可能会收到invalid_token ,因为GoogleAuthUtil可能已经对其进行了caching。 在这种情况下,您应该调用GoogleAuthUtil.invalidateToken

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

编辑2

我只是注意到您在作用域中缺lesshttps://www.googleapis.com/auth/plus.login 。 请尝试添加它,因为似乎必须使用跨客户端标识。

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

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

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