【问题标题】:req.user is blank even after authentication is successful using passportjs with saml即使使用带 saml 的 passportjs 认证成功,req.user 也是空白
【发布时间】:2020-12-06 10:30:51
【问题描述】:

对于我的项目,我需要使用 ADFS + SAML 进行身份验证。

我已按照建议的代码和详细信息进行操作

http://www.passportjs.org/packages/passport-samlhttps://github.com/gbraad/passport-saml-example 的示例代码

认证过程中,认证成功,但req.user始终未定义。

当我尝试使用 CircularJSON.stringyfy 打印请求时,我可以看到 SAMLResponse -> 'body' 中的所有详细信息。

这是我的代码 sn-p

routes.js

module.exports = function (app,config,passport) {
app.get('/', function (req, res) {
    try {
        if (req.isAuthenticated()) {
            console.log(req.session)
            res.send('user authenticated successfully' + req.user.name) // => If I print req using CircularJSON.stringify, I can see all the details.  
           } else {
               //res.send('User not authenticated.')
               res.redirect('/login')
           }
    } catch (error) {
        console.log('Error ' + error);
    }
    
});
app.get('/login',
  passport.authenticate(config.passport.strategy,
    {
      successRedirect: '/',
      failureRedirect: '/login'
    })
);
}

app.js

const express = require('express');
const https = require('https');
const path = require('path');
const passport = require('passport');
const morgan = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
const session = require('express-session');
const errorhandler = require('errorhandler');
const fs = require('fs');

const config = require('./config/config');

console.log('Using configuration', config);

require('./config/passport')(passport, config);

var app = express();
app.use(express.static("public"));
app.set('port', 3000);

app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', 'https://localhost:3000');
  
    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  
    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
  
    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);
  
    // Pass to next layer of middleware
    next();
  });

app.use(morgan('combined'));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false }));
app.use(bodyParser.json({ type: 'application/*+json' }));
app.use(session(
  {
    resave: true,
    saveUninitialized: true,
    secret: 'my_secret',
    cookie: { 
        secure: true,
        httpOnly: true
    }
  }));
app.use(passport.initialize());
app.use(passport.session());



require('./config/routes')(app, config, passport);

const options = {
    key: fs.readFileSync('key.pem'),
    cert: fs.readFileSync('cert.pem')
  };
var my_server = https.createServer(options,app)

my_server.listen(3000);

passport.js

const SamlStrategy = require('passport-saml').Strategy;

module.exports = function (passport, config) {

  passport.serializeUser(function (user, done) {
    done(null, user);
  });

  passport.deserializeUser(function (user, done) {
    done(null, user);
  });

  passport.use(new SamlStrategy(
    {
      path: config.passport.saml.path,
      entryPoint: config.passport.saml.entryPoint,
      issuer: config.passport.saml.issuer,
    },
    function (profile, done) {
      return done(null,
        {
          id: profile.uid,
          email: profile.email,
          displayName: profile.cn,
          firstName: profile.givenName,
          lastName: profile.sn
        });
    })
  );

};

【问题讨论】:

  • 如果你在passport.serializeUser函数中断点或者console.log,是user变量里面的细节吗?
  • req.user 在代码的哪一部分显示为未定义?
  • @bendataclear 在 serializeUser 我得到所有值 undefined .. 比如 user { id: undefined, email: undefined, displayName: undefined, firstName: undefined, lastName: undefined }
  • @Avagantamo 我试过我得到 req.isAuthenticated() 为真
  • 但是当我尝试使用 console.log(CircularJSON.stringify(req)) 时,我可以看到 SAMLResponse 和正文中的所有细节......不知道我错过了什么......

标签: node.js passport.js saml


【解决方案1】:

感谢您的帮助。

让我回答我自己的问题,以防有人觉得它有用。

我犯的错误是在passport.use中

当我将其更改为跟随时,它起作用了..

passport.use(new SamlStrategy(
{
  
  path: config.passport.saml.path,
  entryPoint: config.passport.saml.entryPoint,
  issuer: config.passport.saml.issuer,
  cert: config.passport.saml.cert,
 },
function (profile, done) {
   return done(null,
    {
      id: profile['nameID'],
      email: profile['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name'],
      displayName: profile['http://schemas.microsoft.com/identity/claims/displayname'],
      name: profile['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname'],
      lastName: profile['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname']
    });
    
})

);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2016-12-14
    • 2016-11-12
    • 2017-03-06
    • 1970-01-01
    • 2022-08-14
    • 2011-07-12
    相关资源
    最近更新 更多