Node.js 访问令牌过期后Google API请求无效

Node.js 访问令牌过期后Google API请求无效,node.js,oauth,google-api,google-oauth,google-api-nodejs-client,Node.js,Oauth,Google Api,Google Oauth,Google Api Nodejs Client,正是这个评论让我提出了这个问题 我有一个服务器端Node.js应用程序,使用googleapis包。用户使用他们的Google帐户登录,我在他们的会话中存储令牌。我得到的证书如下 { access_token: '<AN ACCESS TOKEN>', token_type: 'Bearer', id_token: '<A LONG ID TOKEN>', expiry_date: <A TIMESTAMP> } // why do some pl

正是这个评论让我提出了这个问题

我有一个服务器端Node.js应用程序,使用googleapis包。用户使用他们的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
我的两部分问题:

  • 我假设收到该错误消息是因为OAuth客户端对象中的access_令牌已过期(因为在令牌过期之前调用工作正常)。这是正确的吗?为什么错误消息没有更详细

  • 在顶部的链接答案中,解决方案是再次强制接受提示,获取刷新令牌,并将其永久存储,并在其过期时使用它获取新的访问令牌。为什么这是一个更好的选择,而不仅仅是检查令牌是否过期,并在我们想要调用API时让用户重新验证?哪种“正确”的方法可以确保我的登录用户始终可以调用驱动器API来保存他们的文档

  • 对,
    400
    响应是因为访问令牌过期。我不知道谷歌为什么不提供更多细节,但服务使用
    400
    状态代码来表示某种凭证问题是很常见的。状态代码的长度表示这是一个客户端问题

  • 这两种方法都有效,它们各有优缺点。您建议的客户端重新身份验证方法的优点是使实现更简单,因为您不必存储刷新令牌,也不必实现刷新过程。缺点是,强制用户每小时重新验证一次对用户不太友好。至少他们会被重定向到你的应用之外,他们可能还需要显式登录或重新授权。您只需查看权衡并选择最适合您的用例的方案


  • 看起来您正在使用一个不推荐使用的端点来内省令牌,因为
    expires\u in
    确实是Google最近实现的标准行为endpoints@HansZ. 你能澄清一下“终点”和“内省”这两个词吗?为此,我在node.js上使用了最新版本的google API客户端。我的替代方案实际上是,如果访问令牌过期,则强制用户重新授权。这将消除请求“脱机”访问的需要,而我无论如何都不需要。为了澄清这一点,我的目标是允许登录我的web应用超过一小时的用户将其数据保存到Google Drive(我们通过API实现)。必须在数据库中永久存储每个用户的刷新令牌对我来说似乎有点不合适——为什么我必须这样做?@GeorgesPompidou:如果你愿意,你当然可以要求你的用户每小时重新授权一次,但这对用户来说相当不友好。没有人希望被重定向到他们所在的页面之外,也没有人喜欢登录。相比之下,存储刷新令牌(您已经在存储访问令牌)对您来说应该是微不足道的,这样您就可以长时间更新授权,而不会给用户带来麻烦。访问令牌存储在内存数据库中的会话中,并且是短暂的。据我所知,如果我只向用户提示一次权限,刷新令牌需要存储在我的应用程序的长期数据库中,与每个用户关联。这一点,再加上我需要请求“脱机访问”才能获得它(正如我所说,我的应用程序不需要这样做),对我来说似乎很奇怪。这就是为什么我希望有一个更好的方式,我错过了。@GeorgesPompidou:好吧,我现在明白你的意思了。我已经更新了答案,使之更切题。好吧,这是公平的。我还想知道刷新令牌是否过期?如果有,谷歌会给我一个新的吗?或者它只是永久地坐在我的用户表中?
    { [Error: invalid_request] code: 400 } // ...no further details