Passport.js OAuth2 TokenError -> OAuth2Strategy.parseErrorResponse

问题描述 投票:0回答:1

所有愿意阅读本文的人,您好。在浏览了 StackOverflow(和其他网站)上的每个相关问题并试图了解问题的原因之后,我决定自己在这里问一个问题。

首先,我试图遵循一个关于如何实现Node.js Express 应用程序中的 OAuth2 登录/工作流程。这里的主要区别是我想使用不同的 Passport / OAuth2 策略,对此 passport-oauth2 似乎是一个很好的解决方案。 无论如何,应用程序工作正常,直到到达

/callback

部分,我在其中收到此错误(在控制台和页面内容中):

TokenError
  at OAuth2Strategy.parseErrorResponse (D:\User\Documents\OAuth-App\node_modules\passport-oauth2\lib\strategy.js:373:12)
  at OAuth2Strategy._createOAuthError (D:\User\Documents\OAuth-App\node_modules\passport-oauth2\lib\strategy.js:420:16)
  at D:\User\Documents\OAuth-App\node_modules\passport-oauth2\lib\strategy.js:177:45
  at D:\User\Documents\OAuth-App\node_modules\oauth\lib\oauth2.js:191:18
  at passBackControl (D:\User\Documents\OAuth-App\node_modules\oauth\lib\oauth2.js:132:9)
  at IncomingMessage.<anonymous> (D:\User\Documents\OAuth-App\node_modules\oauth\lib\oauth2.js:157:7)
  atIncomingMessage.emit (node:events:377:35)
  at endReadableNT (node:internal/streams/readable:1312:12)
  at processTicksAndRejections (node:internal/process/task_queues:83:21)

授权服务器实际上确实返回了授权代码和状态,所以在我看来它
应该

工作,但由于我之前没有编写过类似的东西(使用护照),也许我只是处理了错误的事情.. .?我还应该在 API 的配置页面上输入正确的重定向 URL (http://localhost:3000/auth/api/callback)。

摩根也记录了这一点(编辑代码和状态以减少长度):

GET /auth/api/callback?code=<around-900-chars>&state=<around-20-chars> 500 799.673 ms - 1103

我已经在 js 文件中定义了该策略,该策略在主 app.js 中是必需的(
require("./config/passport")(passport);

),如下所示:

const OAuth2Strategy = require("passport-oauth2").Strategy;
const mongoose = require("mongoose");
const User = require("../models/User");

module.exports = function (passport) {
    passport.use(
        new OAuth2Strategy(
            {
                authorizationURL: process.env.API_URL + "/v1/oauth2/authorize",
                tokenURL: process.env.API_URL + "/v1/oauth2/token",
                clientID: process.env.API_CLIENT_ID,
                clientSecret: process.env.API_CLIENT_SECRET,
                state: true,
                pkce: true,
                callbackURL: "http://localhost:3000/auth/api/callback",
            },
            async (accessToken, refreshToken, profile, done) => {
                // ... code doesn't reach here
                console.log(profile);
            }
        )
    );

    passport.serializeUser((user, done) => done(null, user.id));

    passport.deserializeUser((id, done) => {
        User.findById(id, (err, user) => done(err, user));
    });
};

我的身份验证路线如下所示:

const express = require("express"); const passport = require("passport"); const router = express.Router(); // @desc Auth with API // @route GET /auth/api router.get("/api", passport.authenticate("oauth2")); // @desc API auth callback // @route GET /auth/api/callback router.get( "/api/callback", passport.authenticate("oauth2", { failureRedirect: "/", }), (req, res) => { res.redirect("/dashboard"); } ); module.exports = router;

并且在主 app.js 中定义如下:

app.use("/", require("./routes/index")); app.use("/auth", require("./routes/auth"));

如果我可以/应该提供任何其他信息,请告诉我。否则...我真的不知道我应该/可以做什么来解决这个问题。

我之前检查过的一些来源/信息页面:

    Passport-OAuth2 Github PKCE 测试
  • 教程中的类似 Github 存储库
  • (要获得概述,请将其与我的实现进行比较)
  • 带有 OAuth2 护照的 PKCE
node.js express oauth-2.0 passport.js
1个回答
0
投票

就我而言,这是因为 SSO 后端中未配置 JWT 私钥和/或证书,因此护照未收到预期的结果。该错误消息的信息量非常小。

© www.soinside.com 2019 - 2024. All rights reserved.