我正在尝试使用针对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中存储其他信息吗?
非常感谢!