Google Auth Node.js在过期时刷新身份验证令牌

时间:2018-06-16 09:14:15

标签: javascript node.js oauth-2.0 google-oauth2 google-api-nodejs-client

我正在尝试使用针对Node.js的Google API访问Google API。 第一步是成功进行身份验证。 我自己设法完成了上半部分的工作,但是为了完成代码,我遗漏了一些东西。让我解释一下。

首先,我在Node.js服务器上创建OAuth2Client。 auth url被发送到浏览器,浏览器将auth代码发送回服务器。然后将此身份验证代码交换为令牌。 刷新令牌被加密并存储在文件系统上的文件中。此文件的名称是Google ID。 访问令牌和exp日期被发送到浏览器,浏览器将它们存储在localStorage中(目前,我还将ID令牌存储在localStorage中,但我不认为这是必要的)。 此时,如果我尝试访问我的Google Drive API,它就可以了! =>身份验证成功。

现在,当我刷新浏览器时,访问令牌从localStorage发送到服务器。如果访问令牌仍然有效,我仍然可以访问我的API。 但是,如果它已过期......我该怎么办? 我知道我需要恢复刷新令牌并使用它来刷新访问令牌,但此时我无法访问Google ID,因此我无法打开一个文件谁的名字我不知道知道。

这是我目前的设置: 我的服务器从浏览器接收令牌对象,其中包含:

{
    access_token: String,
    id_token: String, //This should probably not be stored in the browser
    token_type: "Bearer",
    expiry_date: Number
}

我验证我的令牌是否已过期

// Returns true if expired. When false is returned, I can usually access my Google Drive API but not always, for a still unknown reason.
await OAuth2Client.isTokenExpiring(access_token)

然后我尝试获取访问令牌中包含的信息

await Auth.OAuth2Client.getTokenInfo(access_token).catch(console.error)

当访问令牌有效时调用getTokenInfo会给我提供有趣的信息,例如到期日期,范围和谷歌ID(子)。但是,当访问令牌过期时,我收到以下错误。

Error
    at createError (...path...\node_modules\axios\lib\core\createError.js:16:15)
    at settle (...path...\node_modules\axios\lib\core\settle.js:18:12)
    at IncomingMessage.handleStreamEnd (...path...\node_modules\axios\lib\adapters\http.js:201:11)
    at IncomingMessage.emit (events.js:187:15)
    at endReadableNT (_stream_readable.js:1090:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)

恢复Google ID的另一个想法是从ID令牌中提取它。但是,verifyIdToken在过期时也会给我一个错误。

所以,当我的访问令牌过期时,我有点卡住了。我无法再访问任何数据,因此无法从文件系统中获取刷新令牌。

我确定我错过了一个细节。我应该在localStorage中存储其他信息吗?

非常感谢!

0 个答案:

没有答案