46

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

当用户离开浏览器(例如,一夜之间)时,这个令牌就会过期。gapi.auth2.getAuthInstance().isSignedIn.get()返回 true,但令牌不验证。

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

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

4

5 回答 5

23

如果令牌过期,您可以调用gapi.auth2.getAuthInstance().currentUser.get().reloadAuthResponse(). 它返回一个承诺。

于 2016-06-18T11:10:41.883 回答
6

我已经向谷歌提出了一个问题,因为他们没有正确记录这一点简直太荒谬了。

我在这里的评论建议我如何使用上述内容完成刷新。

于 2020-06-11T03:13:49.687 回答
3

FWIW,我们已经设法(大部分)通过侦听器方法使其工作。似乎在访问令牌到期前约 5 分钟调用了“userChanged”回调。这足以让我们在不刷新页面的情况下提取和更新访问令牌。

但是,当计算机从睡眠中恢复时,这并不完全奏效。这可以通过在唤醒时重新加载页面来相对容易地解决。

于 2016-01-07T06:31:52.240 回答
2

您可以使用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();
}
于 2016-06-01T23:41:50.883 回答
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();
}

检查以获取详细步骤。

于 2015-08-26T14:51:26.490 回答