Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置

Posted

技术标签:

【中文标题】Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置【英文标题】:Node.js passport OAuth 2.0 authentication: where to store access and refresh tokens 【发布时间】:2019-06-18 10:52:51 【问题描述】:

当在 node.js 应用程序中使用 passport 作为 Oauth 2.0 流(例如 Facebook、Twitter 等)的身份验证中间件时,我想知道存储访问令牌和刷新的常见/最佳实践是什么应用程序中的令牌。我不需要将用户帐户存储在应用程序中,我只需要访问令牌即可调用 API。

例如,如果我想通过 OAuth 2.0 身份验证提供程序对用户进行身份验证,以获取用于基于 oauth 的 API 的访问令牌,我可以使用以下 passport strategy:

passport.use(new OAuth2Strategy(
    authorizationURL: 'https://www.example.com/oauth2/authorize',
    tokenURL: 'https://www.example.com/oauth2/token',
    clientID: EXAMPLE_CLIENT_ID,
    clientSecret: EXAMPLE_CLIENT_SECRET,
    callbackURL: "http://localhost:3000/auth/example/callback"
  ,
  function(accessToken, refreshToken, profile, cb) 
    // handle user profile and tokens
    // [...]
  
));

如何以及在何处以安全的方式存储令牌? 可以将令牌附加到用户个人资料吗?像这样:

function(accessToken, refreshToken, profile, cb) 
    profile.accessToken = accessToken;
    profile.refreshToken = refreshToken;
    process.nextTick(() => return cb(null, profile))

【问题讨论】:

【参考方案1】:

可能知道你已经找到了答案,但分享了我的回复,因为这个问题有一些访问,而我也被同样的问题困住了几个小时。

在我解释我如何解决它之前,请注意我正在使用 passport-azure-ad(策略),但我想其他策略也类似。

我注意到有些人将令牌存储在 cookie 中,我不是安全专家,但这可能不是最好的主意。我选择将它们存储在用户的会话中,因此只要会话打开,它们就会保留在服务器端。

有一个很好的细节,为了在会话中存储数据,您需要在策略的回调验证函数中访问 req 对象,您可以使用 6 种不同的原型,但是如果您想访问 req 对象确保启用“passReqToCallback: true”选项并使用以下原型:

function(req, iss, sub, profile, jwtClaims, access_token, refresh_token, params, done)

查看以下示例:

passport.use(new OIDCStrategy(
  //... all your strategy options
  passReqToCallback: true,
,
  function (**req**, iss, sub, profile, accessToken, refreshToken, done) 
    // store tokens in session
    req.session.accessToken = accessToken; 
    req.session.refreshToken = refreshToken;
... 

会话更新后,您可以随时在服务器端访问该值。

【讨论】:

以上是关于Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置的主要内容,如果未能解决你的问题,请参考以下文章

node.js中护照身份验证后如何发送json作为响应

oAuth 2.0 访问令牌验证 node.js

带有 Passport 的 Node.js 身份验证:如果缺少字段,如何闪烁消息?

Google oauth 不返回电子邮件护照身份验证

使用 OAuth 和 Node.JS 对 JIRA REST API 进行身份验证

有人使用带有 OAuth2.0 身份验证系统的 node.js 吗? [关闭]