【发布时间】:2022-02-04 15:15:30
【问题描述】:
我正在尝试使用 passportjs 和 passport-oauth2 设置 discord oauth2 pkce
const discordStrategy = new OAuth2Strategy({
authorizationURL: 'https://discord.com/api/oauth2/authorize',
tokenURL: 'https://discord.com/api/oauth2/token',
clientID: DISCORD_CLIENT_ID,
clientSecret: DISCORD_CLIENT_SECRET,
callbackURL: DISCORD_CALLBACK_URL,
state: true,
pkce: true,
scope: ['identity', 'scope'],
passReqToCallback: true,
},
(req: Request, accessToken: string, refreshToken: string, profile: DiscordUserProfile, cb: any) => {
prisma.user.findUnique({ where: { email: profile.email ?? '' }}).then(foundUser => {
if (foundUser === null) {
// Create a new user with oauth identity.
} else {
cb(null, foundUser)
}
}).catch(error => {
cb(error, null);
})
});
我一直在关注google example 以及其他一些人,这些例子表明,我应该可以使用:
passport.use('discord', discordStrategy);
和
authRouter.get('/discord', passport.authenticate('discord'));
这应该重定向到 OAuth2 提供程序登录页面,但相反,我收到 400 Bad Request “由于语法错误,无法完成请求。”响应正文包含一个对象:
{"scope": ["0"]}
为什么会发生这种情况而不是预期的重定向?
我的意图是,一旦用户登录,我应该得到一个代码,然后我可以发布该代码和代码验证器以获取访问令牌,然后一旦获得访问令牌,就可以进行实际的身份验证调用制作
编辑:我在 passport.authenticate 函数中设置了断点,并逐步完成了它。它实际上确实通过了所有内容并调用了重定向。它生成的解析后的 URL,即使我复制它并手动导航到该 URL,它也给我同样的结果,只是给出:
{"scope": ["0"]}
没有登录页面,为什么?
【问题讨论】:
标签: express oauth-2.0 passport.js