【问题标题】:Passport.js multiple strategies for a single route. Use sessions for only one strategyPassport.js 针对单个路由的多种策略。仅将会话用于一种策略
【发布时间】:2021-09-01 22:10:37
【问题描述】:

我正在使用 ExpressNodeJSPassportJSTypeScript 构建 API 端点。我想为此端点允许两种类型的身份验证。 SAML(用于人类)和用于自动化的令牌。对于人工身份验证,我使用passport-saml 策略。对于令牌身份验证,我使用passport-http 基本身份验证。到目前为止,我的代码如下所示:

import session from "express-session";

const samlStrategy = getSamlStrategy();
const basicStrategy = getBasicStrategy();

app.use((req, res, next) =>
  session({
    // store sessions in db
  })(req, res, next)
);

app.use(passport.initialize());
app.use(passport.session());

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

passport.deserializeUser((username, done) => {
  //...
});

passport.use(samlStrategy);
passport.use(basicStrategy);

const requireApiAuth: express.Handler = (req, res, next) => {
  if (req.user) {
    next();
  } else {
    res.status(401);
  }
};

const tryTokenAuth: express.Handler = (req, res, next) => {
  if (!req.user && req.headers.authorization && req.headers.authorization.indexOf("Basic") > -1) {
    passport.authenticate("basic", { session: false })(req, res, next);
  } else {
    next();
  }
};

//...
// SAML endpoints here
//...

app.use(
  "/api",
  tryServiceUserAuth,
  requireApiAuth,


基本思想是中间件函数tryTokenAuth 将检查请求中是否已经存在user。如果有,则表示有人已经通过 SAML 身份验证登录。如果没有user 并且如果请求指定了基本授权,那么我们应该使用basic 策略进行身份验证。目前,这是有效的。我可以使用 /api 路由的任一策略进行身份验证。

问题是,即使我为basic 身份验证指定了{session: false},我仍然收到在响应中发回的会话cookie。我的数据库中正在记录一个会话。我不明白我需要配置什么来防止这种行为。我不想在使用basic auth 时创建会话。

有没有办法做到这一点?

【问题讨论】:

    标签: node.js express authentication session passport.js


    【解决方案1】:

    事实证明,在验证调用中指定 session: false 只会阻止 passport 将其会话数据添加到请求会话中。仍在创建会话的原因是因为我的配置说:

    app.use((req, res, next) =>
      session({
        // store sessions in db
      })(req, res, next)
    );
    

    为了防止在使用基本身份验证时出现这种情况,我必须更新为:

    app.use((req, res, next) => {
      if (req.headers.authorization && req.headers.authorization.indexOf("Basic") > -1) {
        next();
      } else {
        session({
          // store sessions in db
        })(req, res, next)
      }
    });
    

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多