在 Passport JS 策略中访问 req 和 res

Access req and res inside Passport JS strategy

我正在开发一个应用程序,我希望我的用户能够使用他们的 Spotify 帐户进行连接。我已经设法使用 Passport JS Spotify 策略做到了这一点。现在的问题是,我还想提供一个功能,让用户能够通过电子邮件注册和登录。登录后,他们应该能够 link 他们的 Spotify 帐户到全新的基于电子邮件的帐户。

我有这段代码可以使用 Spotify 策略。

passport.use(
    new SpotifyStrategy(
        {
            clientID: process.env.SPOTIFY_CLIENTID,
            clientSecret: process.env.SPOTIFY_SECRET,
            callbackURL: '/auth/spotify/callback',
            scope: ['user-read-email']
        },
        async function (_accessToken, _refreshToken, _expires_in, profile, cb) {
            return await passportSocialLogin(profile, cb)
        }
    )
)

这里我有那个函数调用(passportSocialLogin)。在这里,我将来自 Spotify 的数据添加到我的数据库中。如果能够将 req 作为 passportSocialLogin 的参数传递,那就太好了。这将帮助我通过会话对象找到已登录的用户,然后 link 他在 Spotify 上的帐户。

你对此有什么想法吗?谢谢!祝你有美好的一天!

我在这里找到了解决方案:https://www.passportjs.org/concepts/delegated-authorization/
如您所见,您可以在策略中使用 passReqToCallback,并且 req 对象将用作验证回调的第一个参数。
就我而言,解决方案是:

passport.use(
    new SpotifyStrategy(
        {
            clientID: process.env.SPOTIFY_CLIENTID,
            clientSecret: process.env.SPOTIFY_SECRET,
            callbackURL: '/auth/spotify/callback',
            scope: ['user-read-email'],
            passReqToCallback: true
        },
        async function (req, _accessToken, _refreshToken, _expires_in, profile, cb) {
            return await passportSocialLogin(profile, req, cb)
        }
    )
)