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

时间:2015-05-21 18:55:34

标签: 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);

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

您不需要使用 Working Code ------------ HTML: <div ng-controller="myCtl" style="margin-top :50 p x;"> <div class="row"> <div class="col-m d-1 col-m d-offset-1"> <p>Click and drag a color onto the grid to the right</p> <div class="peg green" x-l v l-drag gable="true" data-color="green">Green</div> <div class="peg red" x-l v l-drag gable="true" data-color="red">Red</div> <div class="peg blue" x-l v l-drag gable="true" data-color="blue">Blue</div> <div class="peg black" x-l v l-drag gable="true" data-color="black">Black</div> <div class="peg grey" x-l v l-drag gable="true" data-color="grey">Grey</div> </div> <div class="col-m d-10"> <div n g-repeat="r in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"> <span class="slot circle" ng-repeat="c in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" x-l v l-drop-target="true" x-on-drop="dropped(drag E l, drop E l)"></span> </div> </div> </div> </div> Controller( between the modal and view for drag and drop): angular.module('my App', ['l v l. directives .drag drop']) .controller('myCtl', ['$scope', function($scope) { $scope.dropped = function(dragEl, dropEl) { // this is your application logic, do whatever makes sense var drag = angular.element(dragEl); var drop = angular.element(dropEl); console.log("The element " + drag.attr('id') + " has been dropped on " + drop.attr("id") + "!"); }; }]); Modal(fetch the id of the dragged object ): angular.element(element).at tr("id"); Not Working Code ---------------- HTML: <div ng-controller="dd Controller" style="margin-top :50 p x;"> <div class="row"> <div class="col-m d-1 col-m d-offset-1"> <p>Click and drag a color onto the grid to the right</p> <div ng-repeat="list in List"> <div id={{list.Name}} class="item" x-lvl-drag gable="true">{{list.Name}}</div> </div> </div> <div class="col-m d-10"> <div n g-repeat="r in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"> <span class="slot circle" ng-repeat="c in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" x-l v l-drop-target="true" x-on-drop="dropped(drag E l, drop E l)"></span> </div> </div> </div> </div> Controller( between the modal and view for drag and drop): angular.module('my App', ['l v l. directives .drag drop']) .controller('my C t l', ['$scope', function($scope) { $scope.dropped = function(drag E l, drop E l) { // this is your application logic, do whatever makes sense var drag = angular.element(drag E l); var drop = angular.element(drop E l); console.log("The element " + drag. at tr('id') + " has been dropped on " + drop .at tr("id") + "!"); }; }]); Modal(fetch the id of the dragged object ): angular.element(element).at tr("id"); 来获取oauth令牌,您只需要更改范围

app_id

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

更多信息:

Authorizing with Google for REST APIs

Scopes Class

答案 1 :(得分:0)

正如您在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是一个有效的答案

修改

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。请尝试添加它,因为似乎必须使用跨客户端身份。

答案 2 :(得分:0)

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

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

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