【问题标题】:Refresh Google OAuth2 Token Automatically自动刷新 Google OAuth2 令牌
【发布时间】:2022-06-19 07:13:16
【问题描述】:

我正在尝试将照片上传到 Google Drive 功能(使用 Google Drive API 和 GIS)实现到我正在开发的网络应用程序中,但似乎无法弄清楚如何让用户通过身份验证超过访问令牌的指定到期时间(即 1 小时)而不提示用户或打开弹出窗口。

https://github.com/googleworkspace/browser-samples/blob/master/drive/quickstart/index.html 提供的示例代码强制用户单击“刷新”按钮以获取新令牌,但这意味着我必须强制用户每小时登录一次,这并不理想(因为用户可能会一次使用该应用超过一个小时)。

根据https://developers.google.com/identity/oauth2/web/guides/use-token-model#token_expiration,这似乎是故意的。但是,在环顾一番之后,我发现可以使用刷新令牌来生成一个新的访问令牌,该令牌会在一个小时后过期。假设您每 45 分钟左右生成一个新令牌(实际上是另一篇 Google 文章建议的,但我现在似乎找不到),那么您永远不必担心这种重新身份验证。

但是,我不知道如何获取刷新令牌。

Not receiving Google OAuth refresh token 建议发送access_type=offline 作为查询参数,但我没有使用任何重定向,并且上述initTokenClientrequestAccessToken 的文档没有提及access_type 参数。

我得到的最接近的是定期调用requestAccessToken 方法,但这仍然会弹出一个让用户再次登录的弹出窗口,这是我试图避免的。即使使用requestAccessToken({ prompt: "" }) 仍然会弹出此弹出窗口,但它至少无需任何用户输入即可登录。有没有办法完全禁用这个弹出窗口?

在最坏的情况下,我强制用户每小时重新进行身份验证,但这似乎会导致用户体验不太理想。任何帮助表示赞赏。

【问题讨论】:

  • 这个运气好吗?我也有同样的问题
  • 我得出的结论是,当提示符为none 时出现的弹出窗口是用户体验中的一个缺陷。也许他们将来可能会修复它,但目前还没有地方可以向谷歌工程师报告。

标签: javascript google-api google-oauth google-identity


【解决方案1】:

按钮流和同意弹出行为是为了让浏览器获取访问令牌,当将设置提示配置为空字符串时,将禁止在每个请求上弹出用户:prompt=''

如果您想在用户不在场或不必触发令牌请求的情况下代表用户执行操作,则采用带有身份验证代码的 code model 并将刷新令牌交换为访问令牌是您正在寻找的一种手势,例如按下按钮。

【讨论】:

    【解决方案2】:

    我已逐步完成 GIS 库代码,可以确认 prompt='' 和 prompt='none' 没有按照 requestAccessToken 文档所暗示的方式实现。 GIS 总是打开一个弹出窗口。 prompt 参数仅更改弹出窗口中发生的情况。 GIS 中也没有令牌存储或缓存功能,仅在弹出窗口中。

    当前提示参数行为是根据OAuth 2.0 flow comparison 表设计的。只有当用户调用需要它的操作时,才应刷新访问令牌。

    这给我们留下了非常糟糕的 UX 体验,弹出窗口必须每小时左右短暂地打开和关闭。另一种方法是使用授权码流。但它需要实现一种机制,将访问令牌从后端发送回客户端。

    【讨论】:

      猜你喜欢
      • 2018-07-26
      • 2016-08-03
      • 2021-08-27
      • 2013-08-30
      • 2014-08-12
      • 2017-04-20
      • 1970-01-01
      • 2018-02-27
      • 2017-05-12
      相关资源
      最近更新 更多