OAuth Flow重定向到“未授权”页面

时间:2018-03-15 07:32:24

标签: node.js express oauth passport.js

在我的网络应用中,我使用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('/');
});

如果有人知道如何解决这个问题,我将非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我是个白痴。在底部,我应该返回newUser,而不是用户。