我正在尝试将照片上传到Google Drive功能(使用Google Drive API和GIS)实现为我正在工作的web应用程序,但似乎无法弄清楚如何保持用户身份验证的时间超过访问令牌的指定到期时间(这是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文章建议,但我现在似乎找不到它),那么您应该永远不必担心这种重新身份验证。
但是,我不知道如何获得刷新令牌。
没有收到Google OAuth刷新令牌建议发送access_type=offline
作为查询参数,但我没有使用任何重定向,并且前面提到的initTokenClient
和requestAccessToken
文档没有提到access_type
参数。
我得到的最接近的是定期调用requestAccessToken
方法,但这仍然会弹出一个用户再次登录的弹出窗口,这是我试图避免的。即使使用requestAccessToken({ prompt: "" })
仍然会弹出这个弹出窗口,但它至少在没有任何用户输入的情况下登录。有没有办法完全禁用这个弹出窗口?
最坏的情况是,我强迫用户每小时重新验证一次,但这似乎会导致不太理想的用户体验。如有任何帮助,不胜感激。
我已经完成了GIS库代码,并且可以确认prompt= "和prompt='none'没有按照requestAccessToken文档所暗示的方式实现。GIS总是打开一个弹出窗口。prompt参数只改变弹出框中发生的事情。GIS中也没有令牌存储或缓存功能,只有弹出式。
当前的提示参数行为是根据OAuth 2.0流比较表设计的。访问令牌只有在用户调用需要它的操作时才应该刷新。
这给我们留下了非常糟糕的用户体验,弹出窗口必须每隔一小时左右短暂地打开和关闭。另一种方法是使用授权代码流。但是它需要实现一种从后端向客户端发送访问令牌的机制。
按钮流和同意弹出行为是故意为浏览器获取访问令牌,当配置设置提示为空字符串时,将在每次请求时抑制用户弹出:prompt=''
.
如果您想代表用户执行操作,而不需要用户在场或必须使用手势(如按下按钮)触发令牌请求,则需要采用带有验证码的代码模型并将刷新令牌交换为访问令牌。