【问题标题】:PassportJS OAuth2Strategy: authenticate returns 400 instead of redirectingPassportJS OAuth2Strategy:身份验证返回 400 而不是重定向
【发布时间】: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


    【解决方案1】:

    如果您将版本号添加到基本 api url,例如/v9 它给出了完整的错误信息。

    原来我打错了范围,我用的是“身份”而不是“识别”——现在这部分流程正在按预期工作。

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2020-10-15
      • 1970-01-01
      • 2016-04-25
      相关资源
      最近更新 更多