Passport CAS身份验证策略身份验证失败错误

时间:2019-09-04 22:18:09

标签: node.js passport.js 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 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票证。票证验证似乎存在问题,但这只是一个理论。

1 个答案:

答案 0 :(得分:0)

事实证明,passport-cas模块解析是造成此问题的原因。我从CAS 2.0服务器获得的XML响应似乎与模块在响应中期望的格式不同。我创建了自己的自定义护照策略来解决此问题。