所有愿意阅读本文的人,您好。在浏览了 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"));
如果我可以/应该提供任何其他信息,请告诉我。否则...我真的不知道我应该/可以做什么来解决这个问题。
我之前检查过的一些来源/信息页面:
就我而言,这是因为 SSO 后端中未配置 JWT 私钥和/或证书,因此护照未收到预期的结果。该错误消息的信息量非常小。