在我的网络应用中,我使用Spotify的OAuth流程来验证用户身份。我将用户的信息存储在我的数据库中。
passport.use(
new SpotifyStrategy({
clientID,
clientSecret,
callbackURL,
proxy: true
}, async (accessToken, refreshToken, profile, done) => {
const user = await User.findOne({ spotifyId: profile.id });
if (user) {
user.accessToken = accessToken;
user.refreshToken = refreshToken;
const replace = await user.save();
return done(null, replace);
}
const newUser = await new User({spotifyId: profile.id, accessToken, refreshToken}).save();
return done(null, user);
})
换句话说,如果我的用户已存在于我的数据库中,那么我想要做的就是更新访问/刷新令牌。如果用户不存在,那么我想创建一个新的用户文档。
首次使用用户登录我的网络应用时出现问题。我注意到,因为这个第一次使用的用户不在我的数据库中,所以redirect-url会转到一个简单的未经授权的页面。但是,此登录尝试会将用户的信息放入数据库中。因此,即使用户最初访问了未经授权的页面,如果他或她再次尝试登录,它也能成功运行。同样,之前访问过我的网站的任何用户都可以轻松登录。
因此,如果用户的信息不在数据库中,当他们转到路线'/ auth / spotify / callback'时,他们将被重定向到未授权的页面,如果他们已经在,那么网站将正常工作。
我无法弄清楚为什么会这样。我最初认为可能有一个页面需要授权令牌,但由于我的用户可能还没有,它表示未经授权。但是,我做了一些测试,发现这不是原因。我还尝试重定向到不需要授权令牌的页面,但它仍然会混乱。我也想过,也许我在应用程序中错误地拼写了auth回调路线,但我确信我拼写正确。
以下是我的身份验证路线
app.get('/auth/spotify',
passport.authenticate('spotify', {
scope: ['playlist-read-collaborative', 'playlist-read-private',
'user-read-playback-state', 'user-modify-playback-state',
'user-read-currently-playing', 'streaming']
}),
(req, res) => {
}
)
app.get('/auth/spotify/callback',
passport.authenticate('spotify'),
(req, res) => {
res.redirect('/');
});
如果有人知道如何解决这个问题,我将非常感激。谢谢!
答案 0 :(得分:0)