这就是让我问这个问题的评论。
我有一个服务器端Node.js应用程序,使用googleapi包。用户使用他们的Google帐户登录,我将令牌存储在他们的会话中。我得到的凭证如下
{ access_token: '<AN ACCESS TOKEN>',
token_type: 'Bearer',
id_token: '<A LONG ID TOKEN>',
expiry_date: <A TIMESTAMP> } // why do some places say there's an expires_in instead of this
没有refresh_token
,因为用户已经第一次登录并单击了accept,并且我没有存储刷新令牌(看起来我应该存储)。
因此,当到达expiry_date
时,如果用户试图请求我们将某些内容保存到他们的google驱动器,我得到一个错误消息:
{ [Error: invalid_request] code: 400 } // ...no further details
我的两部分问题:
我假设我得到错误消息,因为我的OAuth客户端对象中的access_token已经过期(因为在令牌到期之前调用工作正常)。这是正确的吗?为什么错误消息没有更详细?
在顶部的链接答案中,解决方案是再次强制接受提示,获取刷新令牌,并永久存储它,并在它过期时使用它来获取新的访问令牌。为什么这比仅仅检查令牌是否过期以及当我们想要调用API时让用户重新身份验证更好呢?这是"正确"的方式,以确保我的登录用户总是可以使驱动器API调用来保存他们的文档?
-
正确,
400
响应是由于访问令牌过期。我不确定为什么Google没有提供更多细节,但是服务使用400
状态码来指示某种凭据问题是很常见的。状态码的定义表明这是一个客户端问题。 -
两种方法都有效,它们各有优缺点。您建议的客户端重新身份验证方法的优点是使实现更简单,因为您不必存储刷新令牌,也不必实现刷新过程。缺点是强迫用户每小时重新验证一次,这对用户来说不太友好。至少他们会被重定向离开你的应用,他们可能需要明确登录或重新授权。您只需要查看权衡并选择最适合您的用例的方法。