页面重载后Google oauth会话丢失(javascript)



我最近从弃用的gapi.auth2移动到新的Google身份服务,使用javascript客户端库,并注意到一个很大的区别:如果有人登录,然后重新加载页面,会话丢失,并且必须再次登录,每次加载页面。对于已弃用的库,情况并非如此。使用Calendar API示例可以很容易地重现这个问题。

是否有任何配置选项来保持会话持久?或者我是否需要以某种方式存储访问令牌?我在官方文件中找不到任何相关的东西。

更新:

迁移指南说明如下:

以前,Google Sign-In帮助您管理用户登录状态使用:

  • 回调处理程序用于监视用户的会话状态。
  • 监听事件和更改用户的Google帐户的登录状态。

你负责管理你的web应用程序的登录状态和用户会话。

但是,绝对没有关于需要做什么的信息。

更新2

更具体地说,实际的问题不是使会话持久。管理登录状态和用户会话是我可以解决的问题。

真正的问题是用于调用Google api的访问令牌。正如在评论中提到的,访问令牌是1)短暂的,2)不会存储在任何地方,所以即使没有过期,它们也不会在页面重新加载之间持续存在。

Google为此提供了requestAccessToken方法,但是即使我指定prompt: '',它也会打开登录弹出窗口。如果我还指定hint选项与登录用户的电子邮件地址,那么弹出打开,显示加载动画简短,并关闭没有用户交互。我可以忍受这一点,但是这只有在用户交互触发时才有效,否则浏览器会阻止弹出窗口,这意味着我不能在没有用户交互的情况下更新令牌,例如在页面加载时。有什么建议来解决这个问题吗?

我遇到了你在问题中描述的所有相同的问题。

为了帮助:

  1. Google 3P授权JavaScript库:在这个链接中我们可以检查新库拥有的所有方法(它不刷新令牌等)
  2. 这个文档说库将不再控制cookie来保持状态。

解决方案

  • 首先我要感谢@Sam O'Riil的回答。

正如Sam所描述的:"你可以通过某种方式保存访问令牌,并在页面重新加载后使用它来加速。">

给定Google的示例,我们应该调用initTokenClient以配置Google验证和requestAccessToken以弹出验证:

tokenClient = google.accounts.oauth2.initTokenClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
prompt: 'consent',
callback: tokenCallback
});
tokenClient.requestAccessToken({prompt: ''})

在您的tokenCallback中,您可以保存您获得的凭据,例如:

const tokenCallback(credentials) => {
// save here the credentials using localStorage or cookies or whatever you want to.
}

最后,当您重新启动/重新加载应用程序并再次初始化gapi.server时,您只需要再次获得凭据并将令牌设置为gapi,如:

gapi.load('client', function() {
gapi.client.init({}).then(function() {
let credentials = // get your credentials from where you saved it
credentials = JSON.parse(credentials); // parse it if you got it as string
gapi.client.setToken(credentials);
... continue you app ...
}).catch(function(err) {
// do catch...
});
});

这样做,您的应用程序将在重新加载后工作。我知道这可能不是最好的解决方案,但看看你有什么和图书馆提供的,我认为这是你可以做的。

注。:令牌1小时后过期,没有刷新令牌(使用隐式流),所以,您必须要求用户再次登录。

最新更新