在passport应用程序中将node.js用作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))
}
答案 0 :(得分:2)
大概知道您已经找到了答案,但是分享了我的回答,因为这个问题有很多人来访,我也被困了几个小时才遇到同样的问题。
在解释解决方法之前,请注意我正在使用 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;
...
会话更新后,您可以随时在服务器端访问它。