我正在使用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
身份验证时创建会话。
有什么方法可以做到这一点吗?
发布于 2021-09-01 06:10:38
事实证明,在身份验证调用中指定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)
}
});
https://stackoverflow.com/questions/68944817
复制