我正在使用Google登录。用户来到我的站点并使用gapi.auth2.getAuthInstance().signIn()
登录,或者他们已经登录,当页面加载(或重新加载)时,我们获取状态。在这一点上,我有一个身份令牌好一个小时,我可以在服务器上验证。
当用户离开浏览器(例如,过夜)时,此令牌将过期。 gapi.auth2.getAuthInstance().isSignedIn.get()
返回true,但令牌未验证。
如何在会话处于活动状态时(即浏览器尚未关闭)登录用户并保持登录状态?或刷新令牌?比重新加载页面更优雅...
编辑:刷新令牌不是正确答案;我不想离线访问(并且不想要求许可)。谷歌显然认为用户仍然登录我的应用程序;用户可以重新加载页面并获取新令牌而无需再次提供凭据。当然有一些机制比隐藏的iframe更优雅,以获得更新的令牌?
答案 0 :(得分:13)
如果令牌已过期,您可以致电gapi.auth2.getAuthInstance().currentUser.get().reloadAuthResponse()
。它返回一个Promise。
答案 1 :(得分:2)
FWIW,我们设法(主要)通过listener approach使其工作。似乎' userChanged'在访问令牌到期前约5分钟调用回调。这足以让我们在不刷新页面的情况下提取和更新访问令牌。
虽然计算机从睡眠状态恢复,但不起作用的是什么。这可以通过reloading the page on wake up相对容易地解决。
答案 2 :(得分:2)
我提出了一个issue with Google over this,因为他们没有正确记录此事简直太荒谬了。
My comment here建议使用上述方法完成刷新。
答案 3 :(得分:1)
您可以使用listeners完成此操作。
var auth2 = gapi.auth2.getAuthInstance();
// Listen for changes to current user.
// (called shortly before expiration)
auth2.currentUser.listen(function(user){
// use new user in your OpenID Connect flow
});
只要浏览器保持活动状态,这将允许您保留当前凭据。
如果计算机处于休眠状态,则必须完成其他工作以获取当前凭据。
if (auth2.isSignedIn.get() == true) {
auth2.signIn();
}
答案 4 :(得分:0)
您可以使用刷新令牌来获取离线访问权限。根据官方参考
访问令牌的生命周期有限。如果您的应用需要在单个访问令牌的生命周期之后访问Google API,则可以获取刷新令牌。刷新令牌允许您的应用程序获取新的访问令牌。
基本上,当您第一次要求身份验证时,您将获得refresh token
。您需要安全地保存该令牌以备将来使用。 access token
(您提到的身份令牌)在一小时后过期。之后,每次要获得新的可用refresh token
时,都必须使用access token
。
根据您使用的客户端库,语法会有所不同。以下是php客户端库的示例。
// get access token from refresh token if access token expire
if($client->getAuth()->isAccessTokenExpired()) {
$client->refreshToken($securelyPreservedRefreshToken);
$newToken = $client->getAccessToken();
}
检查this了解详情步骤。