如何刷新过期的谷歌登录登录?

时间:2015-08-21 23:51:30

标签: google-signin google-plus-signin google-identity

我正在使用Google登录。用户来到我的站点并使用gapi.auth2.getAuthInstance().signIn()登录,或者他们已经登录,当页面加载(或重新加载)时,我们获取状态。在这一点上,我有一个身份令牌好一个小时,我可以在服务器上验证。

当用户离开浏览器(例如,过夜)时,此令牌将过期。 gapi.auth2.getAuthInstance().isSignedIn.get()返回true,但令牌未验证。

如何在会话处于活动状态时(即浏览器尚未关闭)登录用户并保持登录状态?或刷新令牌?比重新加载页面更优雅...

编辑:刷新令牌不是正确答案;我不想离线访问(并且不想要求许可)。谷歌显然认为用户仍然登录我的应用程序;用户可以重新加载页面并获取新令牌而无需再次提供凭据。当然有一些机制比隐藏的iframe更优雅,以获得更新的令牌?

5 个答案:

答案 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了解详情步骤。