我已阅读有关刷新令牌的文档,但我很难将它们应用到我的代码中。
我认为正确的方法是php生成刷新令牌,将其发送到客户端,然后客户端停止使用id_token并仅使用刷新令牌发出请求?但这似乎只是打败了令牌过期的目的。
如何在此方案中处理令牌过期并使用刷新令牌:
我使用https://apis.google.com/js/platform.js通过以下方式验证Google帐户:
<div class="g-signin2" data-onsuccess="onSignIn"></div>
然后使用onSignIn,在使用php检查后端服务器上的id_token登录后,使用ajax从服务器获取一些数据:
function onSignIn(googleUser) {
var profile = googleUser.getBasicProfile();
id_token = googleUser.getAuthResponse().id_token;
angular.element(document.getElementById('data_controller')).scope().get_data();
};
相关的Angular JavaScript是:
angular.module('myApp', ['ngDialog']);
angular.module('myApp').controller('data_controller', function($scope, $q, $http, ngDialog) {
$scope.get_data = function() {
$http({
headers: { "Content-Type": "application/x-www-form-urlencoded", "id_token": id_token },
url: "http://myserver/api/application.php",
method: "POST",
data: {}
})
.then(function successCallback(response) {
$scope.my_data = response.data.results;
$scope.token_used = id_token;
console.log(response.data);
});
}
});
这很好用,但是一旦id_token在一小时后过期,ajax就会失败。
开http://myserver/api/application.php我正在检查请求标题中提供的令牌:
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=" . $id_token;
如果客户重新加载页面,一切正常,因为谷歌会自动提取新的id_token。
答案 0 :(得分:1)
我错误地使用了令牌。
我改变了:
headers: { "Content-Type": "application/x-www-form-urlencoded", "id_token": id_token },
要:
headers: { "Content-Type": "application/x-www-form-urlencoded", "id_token": gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse().id_token },
这样它就会发送当前令牌。我还没有意识到令牌会在后台自动刷新。我每次都发送原始令牌,所以一旦过期,应用程序就会失败。