我正在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 module source code 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票证。票证验证似乎存在问题,但这只是一个理论。
答案 0 :(得分:0)
事实证明,passport-cas模块解析是造成此问题的原因。我从CAS 2.0服务器获得的XML响应似乎与模块在响应中期望的格式不同。我创建了自己的自定义护照策略来解决此问题。