我使用以下内容获取可以从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”如果我没记错的话。)
代码并不总是有效(在我的服务器上),我希望能够检查代码是否可以使用或已过期。
答案 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
更多信息:
答案 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>