【发布时间】:2021-09-01 22:10:37
【问题描述】:
我正在使用 Express、NodeJS、PassportJS 和 TypeScript 构建 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