我已经使用mongo db设置了Spotify护照策略,以保存用户个人资料,访问和刷新令牌。但是,除了最初的身份验证路由和回调URL之外,我是否还需要将password.authenticate作为回调传递给每个路由?还是我应该有一个自定义的中间件来检查cookie会话模块是否在请求中仍然具有req.user?我认为这是两种可能性。哪个是正确的?我知道在Cookie方面,它最终会过期,并且/ auth路由将需要再次调用。
我做了一个中间件功能,可以检查请求对象的用户属性。但是不确定如何测试。也许减少cookie的有效时间并检查req.user是否为假。
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id)
.then((user) => {
done(null, user);
});
});
passport.use(new SpotifyStrategy({
clientID: keys.spotifyClientID,
clientSecret: keys.spotifyClientSecret,
callbackURL: '/auth/spotify/callback',
proxy: true
}, async (accessToken, refreshToken, profile, done) => {
const spotifyId = profile.id
const name = profile.displayName
const email = profile.emails[0].value
const existingUser = await User.findOne({ spotifyId: profile.id });
if (existingUser) {
return done(null, existingUser);
}
const user = await new User({ spotifyId, name, accessToken, refreshToken}).save();
done(null, user);
}));
Check the cookie middleware:
module.exports = isAuthenticated = (req, res, next) => {
if (req.user) {
return next();
}
return res.redirect('/auth/spotify');
}
Example route:
module.exports = (app) => {
app.get('/api/spotify/playlists', passport.authenticate('spotify'),
(req, res) => {
console.log('got here')
console.log(req.user);
//return playlists
});
}
答案 0 :(得分:1)
您可以创建一个middleware
来检查用户是否为authenticated
,并将该middleware
添加到您的routes
中。
每次调用请求时,护照都会运行deserializeUser
,并将经过身份验证的用户存储在req.user
中。 middleware
将检查req.user
是否存在,如果退出,则表示用户为logged in
和authenticated
,并且可以允许请求继续进行。
您不需要在每个请求中都使用passport.authenticate('spotify')
,只需要在login
(或registration
)时使用它。
可以这样添加中间件:
function isAuthenticated(req, res, next) {
if (req.user) {
next();
} else {
res.redirect('/login');
}
}
app.get('/api/spotify/playlists', isAuthenticated,
(req, res) => {
console.log('got here')
console.log(req.user);
//return playlists
});
我希望这对您有用。