【问题标题】:passport saml how to pass profile data to route护照 saml 如何将配置文件数据传递给路由
【发布时间】:2021-02-11 05:26:50
【问题描述】:

当我创建 passport-saml 策略时,在登录期间,有一个配置文件对象传递给中间件函数,其中包含 nameID 信息。我需要该信息以便稍后退出。

// passportHandler.js
const passport = require("passport");
const passportSaml = require("passport-saml");

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

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

// SAML strategy for passport -- Single IPD
const samlStrategy = new passportSaml.Strategy(
  {
    entryPoint: process.env.SSO_ENTRYPOINT,
    logoutUrl: process.env.SSO_LOGOUT,
    issuer: process.env.SSO_ISSUER,
    callbackUrl: process.env.SSO_CALLBACK_URL || undefined,
    path: process.env.path,
    cert: process.env.SSO_CERT.replace(/\\n/gm, "\n"), // change "\n" into real line break
  },
  (profile, done) => {
    console.log('profile', profile);  // nameID and nameIDFormat are in profile object
    done(null, profile)
  }
);

passport.use(samlStrategy);

module.exports = passport;

index.js

// index.js of Express server
import passport from "./src/passportHandler";
import { getLogout } from "./src/routes.js";
const app = express();
app.use(passport.initialize());
app.use(passport.session());
app.get('/sso/logout', getLogout); // this route, I need the above 2 data

getLogout 函数从另一个文件导入,我对nameIDnameIDFormat 进行了硬编码,我如何从profile 对象的开头获取它们,将它们保存在某个地方,然后将它们传递到此路由?

// routes.js
export const getLogout = (req, res) => {
  !req.user && (req.user = {})
  req.user.nameID = 'Eric1234@outlook.onmicrosoft.com'; // hardcode, how to pass this info?
  req.user.nameIDFormat = 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress'; // hardcode too
  const samlStrategy = req._passport?.instance?._strategies?.saml;  // is this correct?
  samlStrategy.logout(req, (err, request) => {
    if (!err) {
      res.redirect(request);
    }
  })
};

我的第二个问题是,我从req._passport?.instance?._strategies?.saml 获取了 samlStrategy 对象,这是获取它的正确方法吗?或者,同样的问题,我怎样才能从一开始就将 saml strategy obj 传递给这条路线?

感谢您的帮助!

【问题讨论】:

    标签: express passport.js passport-saml


    【解决方案1】:

    回答我自己的愚蠢问题...

    在 samlStrategy 中,最后调用 done(null, profile)

    const samlStrategy = new passportSaml.Strategy(
      {
        entryPoint: process.env.SSO_ENTRYPOINT,
        logoutUrl: process.env.SSO_LOGOUT,
        issuer: process.env.SSO_ISSUER,
        callbackUrl: process.env.SSO_CALLBACK_URL || undefined,
        path: process.env.path,
        cert: process.env.SSO_CERT.replace(/\\n/gm, "\n"), // change "\n" into real line break
      },
      (profile, done) => {
        console.log('profile', profile);  // nameID and nameIDFormat are in profile object
        done(null, profile)
      }
    );
    

    那么profile对象会在Service Provider的Login Post回调函数中变成req.user对象

    然后我可以将用户对象保存在某个地方,并在调用logout 时再次使用它。

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 2017-11-21
      • 2017-07-31
      • 1970-01-01
      • 2016-08-18
      • 2022-01-13
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      相关资源
      最近更新 更多