首页 > 解决方案 > 如何从 google Passport 检索、保存和更新 idToken

问题描述

我在我的 nodejs 应用程序中使用 google oauth 护照策略,但我不知道存储和更新我的 idToken 的正确方法,因此我可以在对外部 api 进行 api 调用时将其用于身份验证。目前,我正在将令牌写入文本文件并从那里读取。我觉得这是一个坏主意,只需要关于如何以更优雅的方式做到这一点的建议。

module.exports = function (passport) {


passport.use(new GoogleStrategy({
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    
    callbackURL: url    },
async (accessToken, refreshToken, params, profile, done) => {
       const idToken = params.id_token
       
       fs.writeFile('token.txt', idToken, err => {
        if (err) {
          console.error(err)
          return
        }
        //file written successfully
        console.log("file written successfully")
      })         
      }

标签: node.jspassport.jspassport-google-oauth

解决方案


正如另一位发帖人所指出的,如果您只是将令牌用于登录,您可能根本不需要存储和更新 ID 令牌。

但是,如果您使用令牌访问 Google API,并且即使没有用户在场,您也需要访问,最常见的方法是:

  • 将加密的访问令牌和刷新令牌存储在数据库中,两者都与用户相关联
  • 使用访问令牌时,请检查来自 Google 的指示令牌已过期的错误响应,使用刷新令牌获取新的访问令牌,并将新的访问令牌保存在您的数据库中(再次加密)

在 Google 的情况下,请务必传递access_type=offline参数以检索刷新令牌。此外,如果这是您之前授权的用户,您需要通过prompt=consent,否则 Google 不会发出刷新令牌。

实现上述所有内容的另一种方法是使用我工作的Xkit 之类的托管 OAuth 服务。它处理存储、加密和刷新令牌,以及所有特定于提供商的细微差别。同样,仅在您使用令牌访问 API(而不是用于登录)的情况下才有用,但需要考虑另一种选择。


推荐阅读