首页 > 解决方案 > 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 票。票证验证似乎存在问题,但这只是一个理论。

标签: node.jspassport.jscas

解决方案


事实证明,passport-cas 模块解析导致了这个问题。我从 CAS 2.0 服务器返回的 XML 响应的格式似乎与模块在响应中所期望的格式不同。我创建了自己的自定义护照策略来解决这个问题。


推荐阅读