node.js - Passport CAS认证策略认证失败错误
问题描述
我正在 NodeJS 12 Express 4 中构建一个应用程序。我正在使用passport-cas模块将身份验证与 CAS 集成。
这是配置(示例)。注意我使用的是 CAS2.0,但说明说要将配置设置为 CAS3.0 并提供验证端点,我已经这样做了。
# CAS 2.0 will work with the CAS 3.0 configuration, but you need to set the validation endpoint
CAS_VERSION=CAS3.0
CAS_SSO_BASE_URL=https://example-cas-server/cas
CAS_SERVER_BASE_URL=https://my-app.example.com/api/login/cas
CAS_VALIDATE_URL=https://example-cas-server/cas/serviceValidate
配置策略
const passport = require('passport');
const CasStrategy = require('passport-cas').Strategy;
// Cas strategy passport.authenticate('cas');
passport.use(new CasStrategy({
version: process.env.CAS_VERSION,
ssoBaseURL: process.env.CAS_SSO_BASE_URL,
serverBaseURL: process.env.CAS_SERVER_BASE_URL,
validateURL: process.env.CAS_VALIDATE_URL
}, function (profile, done) {
var login = profile.user;
console.log(`****** CAS STRATEGY ******`);
User.findOne({ login: login }, function (err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, { message: 'Unknown user' });
}
return done(null, user);
});
}));
调用策略,策略完成后回调。
router.get('/api/login/cas', (req, res, next) => {
passport.authenticate('cas', function (err, user, info) {
// Callback after authentication strategy is complete
console.log(`info: ${info}`);
// Check error
if (err) {
console.error(err);
return res.status(404).json(err);
}
// Check if user was returned
if (user) {
return res.status(200).json(user);
}
})(req, res);
}
});
身份验证工作流程似乎正在处理票证验证。当用户登录时,Web 应用程序重定向到 SSO 提供程序,用户在 SSO 页面中输入凭据,然后将响应发送回 Web 应用程序。但是,似乎验证过程失败并显示此错误消息。错误发生在passport-cas 模块源代码 index.js第 106 和 126 行。
ST 票证作为查询参数返回到应用程序/api/login/cas?ticket=ST-1430649-Y-pvbZj5j5boKYi-tn4KQC684D8ip-10-137-43-111
。虽然,我认为在完成策略并调用回调之前,应该将票证发送到 serviceValidate url 进行验证(而不是返回到应用程序)。
****** CAS STRATEGY ******
Error: Authentication failed
at /home/node/app/node_modules/passport-cas/index.js:126:45
at Parser.<anonymous> (/home/node/app/node_modules/xml2js/lib/xml2js.js:384:20)
at Parser.emit (events.js:203:13)
at SAXParser.onclosetag (/home/node/app/node_modules/xml2js/lib/xml2js.js:348:26)
at emit (/home/node/app/node_modules/sax/lib/sax.js:615:33)
at emitNode (/home/node/app/node_modules/sax/lib/sax.js:620:3)
at closeTag (/home/node/app/node_modules/sax/lib/sax.js:861:5)
at SAXParser.write (/home/node/app/node_modules/sax/lib/sax.js:1294:29)
at Parser.exports.Parser.Parser.parseString (/home/node/app/node_modules/xml2js/lib/xml2js.js:403:31)
at Parser.parseString (/home/node/app/node_modules/xml2js/lib/xml2js.js:6:61)
at exports.parseString (/home/node/app/node_modules/xml2js/lib/xml2js.js:433:19)
at Strategy._validate (/home/node/app/node_modules/passport-cas/index.js:106:21)
at IncomingMessage.<anonymous> (/home/node/app/node_modules/passport-cas/index.js:195:25)
at IncomingMessage.emit (events.js:208:15)
at endReadableNT (_stream_readable.js:1168:12)
at processTicksAndRejections (internal/process/task_queues.js:77:11)
GET /api/login/cas?ticket=ST-1430649-Y-pvbZj5j5boKYi-tn4KQC684D8ip-10-137-43-111 404 123.623 ms - 2
问题:
我应该如何着手解决问题?如前所述,SSO 提供商似乎正在正确地完成其工作并返回 ST 票。票证验证似乎存在问题,但这只是一个理论。
解决方案
事实证明,passport-cas 模块解析导致了这个问题。我从 CAS 2.0 服务器返回的 XML 响应的格式似乎与模块在响应中所期望的格式不同。我创建了自己的自定义护照策略来解决这个问题。
推荐阅读
- javascript - 使用 beforeProcessing 或 beforeRequest 事件显示消息
- powerbuilder - 如何使用快捷栏和 xplistbar 创建用户访问权限
- javascript - Javascript / TypeScript 订阅中使用 Promise 时的潜在竞争条件
- c# - EF Core 5:使用与 FK 相同的 PK 配置拥有的类型且没有父属性
- jekyll - 仅在第一次运行时调用 Jekyll 生成器插件,而不是在重新生成时调用
- javascript - Fabric JS - 使用 JSON diff 进行 UNDO 和 REDO 优化
- reactjs - Next.js:在单击提交按钮之前提交表单
- flutter - 在 Flutter Web 中使用实时数据库模拟器
- python - python中不同颜色的簇的图
- asp.net-core - OpenTelemetry、AspNetCore 和 Jaeger - 入门问题