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

rev*_*evy 5 javascript node.js access-token oauth-2.0 passport.js

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

例如,如果我想向OAuth 2.0身份验证提供程序验证用户以获取访问令牌以用于基于oauth的API,则可以使用以下通行证策略

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
    // [...]
  }
));
Run Code Online (Sandbox Code Playgroud)

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

function(accessToken, refreshToken, profile, cb) {
    profile.accessToken = accessToken;
    profile.refreshToken = refreshToken;
    process.nextTick(() => return cb(null, profile))
}
Run Code Online (Sandbox Code Playgroud)

小智 4

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

在我解释如何解决它之前,请注意我正在使用护照天蓝色广告(策略),但我想其他策略也会类似。

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

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

function(req, iss, sub, profile, jwtClaims, access_token, refresh_token, params, done)
Run Code Online (Sandbox Code Playgroud)

检查下面的示例:

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;
... 
Run Code Online (Sandbox Code Playgroud)

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