Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为一条路由Passport.js多个策略。将会话仅用于一种策略

为一条路由Passport.js多个策略。将会话仅用于一种策略
EN

Stack Overflow用户
提问于 2021-08-26 12:14:48
回答 1查看 135关注 0票数 0

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

代码语言:javascript
运行
AI代码解释
复制
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身份验证时创建会话。

有什么方法可以做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-01 06:10:38

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

代码语言:javascript
运行
AI代码解释
复制
app.use((req, res, next) =>
  session({
    // store sessions in db
  })(req, res, next)
);

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

代码语言:javascript
运行
AI代码解释
复制
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)
  }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68944817

复制
相关文章
[技巧]如何在Google Chrome中启用Windows MR支持?
1 月下旬的时候,我们报道过 Google Chromium 将引入对 Windows MR 混合现实头显支持的消息。现在,在最新的 Chrome Canary 分支中,谷歌已经正式加入了专属标记。如需启用,请移步至 chrome://flags,搜索 Windows Mixed Reality,然后选择启用(Enabled)。
Zip
2019/03/06
1.2K0
[技巧]如何在Google Chrome中启用Windows MR支持?
videojs实际应用
一个页面一个video,点击切换显示不同的画面 <div v-html="videoHtml"> </div> initVideo(){ this.videoHtml = '<video ref="videotest" id="video" width="865" height="460" preload="auto" class="video-js" controls></video>' this.$nextTick(()=>{ let option
tianyawhl
2022/08/07
1.9K0
videojs中文文档详解 videojs有什么用处
当在工作中需要展示文档,视频等内容时,对于怎么展示相关视频,转载相关视频格式难倒了许许多多的人。而上相关网站搜索得出来的关键词videojs也让很多人疑惑不已。那么什么是videojs?下面就一起看看吧。
用户8715145
2021/06/24
4.2K0
如何在SwiftUI中实现interactiveDismissDisabled
由于健康笔记[2]中数据录入都是在Sheet中进行的,为了防止用户在录入过程中由于误操作(使用手势取消Sheet)丢失数据,因此,从最初的版本开始,我就一直使用各种手段加强对Sheet的控制。
东坡肘子
2022/07/28
4K0
如何在SwiftUI中实现interactiveDismissDisabled
如何在 MongoDB 中实现事务
在 MongoDB 中,事务可以用于在一个或多个集合上执行多个操作。事务可以帮助确保数据的一致性和可靠性。
玖叁叁
2023/04/14
2.6K0
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。
AiDBA宝典
2019/09/30
30K0
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
videojs插件使用「建议收藏」
使用整理:使用主要针对于移动端视频播放,考虑的点:视频显示适配手机宽度;适配定义样式;在微信端,安卓、ios视频空间控件不同,定制等会自动被微信视频控件覆盖;播放过程中定制暂停/播放按钮事件等;播放结束后定制重播、下一个视频事件,读秒播放下一个视频
全栈程序员站长
2022/11/01
10.5K0
如何在Python中实现RFM分析
本文介绍了如何利用Python实现RFM分析。首先,介绍了RFM分析的基本概念,然后详细讲解了如何在Python中实现这个过程。主要包括计算RFM各项分值、归总RFM分值、根据RFM分值对客户分类以及具体的算法实现。最后,介绍了在Python中应用RFM分析的示例代码。
Erin
2018/01/09
4K0
如何在Python中实现RFM分析
如何在Excel中实现手写签名?
Hello各位,本葡萄又来啦,今天遇到的场景是这样的:在日常业务流程中,经常需要某一流程环节中相关责任人员进行审批签字,早期许多公司为了省事就直接会把这位负责人的签名以键盘打字(楷体)的形式打印出来,但是这样的坏处就是会导致所有的负责人的签名都是一样的,没有美感,为了解决这个问题,一些公司就开始使用手写签名(用鼠标写出来的签名)代替电子签名,今天本葡萄就为大家简单的介绍下手写签名到底是怎么实现的。话不多说,先上效果图:
葡萄城控件
2023/10/16
7600
如何在Excel中实现手写签名?
如何在Impala中实现拉链表
拉链表是针对数据仓库设计中表存储数据的方式而定义的,即是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。传统数据仓库一般采用拉链的方式保留主数据(例如客户信息)的变化数据,采用这种设计方式的主要原因是减少数据冗余。这个需求在Hadoop中主要是有以下两种实现方式选择:
Fayson
2018/03/29
3.1K0
如何在Python中实现矩阵分析
Erin
2018/01/09
2.6K0
如何在Python中实现矩阵分析
如何在 Google 跟踪代码管理器 (GTM) 中安装 Matomo 跟踪?
将 Matomo 跟踪添加到您的 Google 跟踪代码管理器非常简单。本指南为 Matomo 云客户和 Matomo 本地用户解释了入门所需的所有步骤。
西里国际站
2023/08/23
4680
如何在 Google 跟踪代码管理器 (GTM) 中安装 Matomo 跟踪?
如何在Google搜索到我的网站?
我需要解析的域名为 taixingyiji.com,我的域名解析商是CloudFlare
taixingyiji
2022/07/25
2.3K0
如何在Google搜索到我的网站?
如何在 PowerBI 中实现矩阵行中迷你图
这里显示了每位销售经理的 YTD 销售完成以及他的目标之间的差异,并通过迷你图实现了快速预览,以便直观看出其销售趋势。
BI佐罗
2022/01/05
6.1K0
如何在 PowerBI 中实现矩阵行中迷你图
如何在MATLAB中实现各种特殊上标?
本文只针对特殊上标情况,上下角标可由符号“^”或者“_”实现,故不在本文讨论范围之内,特殊上标的示例如下图所示。
巴山学长
2021/07/30
4.6K0
如何在Kubernetes中实现容器原地升级
在Docker的世界,容器镜像作为不可变基础设施,解决了环境依赖的难题,而Kubernetes将这提升到了Pod的高度,希望每次应用的更新都通过ReCreate Pod的方式完成,这个理念是非常好的,这样每次ReCreate都是全新的、干净的应用环境。对于微服务的部署,这种方式并没有带来多大的负担,而对于传统应用的部署,一个Pod中可能包含了主业务容器,还有不可剥离的依赖业务容器,以及SideCar组件容器等,这时的Pod就显得很臃肿了,如果因为要更新其中一个SideCar Container而继续按照ReCreate Pod的方式进行整个Pod的重建,那负担还是很大的,体现在:
Walton
2019/04/15
6.7K0
如何在Kubernetes中实现容器原地升级
如何在小程序中实现音频播放
在如何使用小程序媒体组件这篇文章中,我们介绍了小程序媒体组件的使用,但是对音频组件部分讲的不够详细,本文将对音频部分做些补充。
硬盘侠
2018/11/12
17.6K0
如何在 ClickHouse 中实现行列转换
当我们在进行数据分析时,时常会遇到行转列、列转行的查询需求。今天就来聊一聊如何在 CH 中实现这些查询。
Nauu
2020/06/29
14.5K0
点击加载更多

相似问题

使用Google ima sdk和videojs在广告中搜索

114

IMA问题- Google IMA HTML5 SDK

17

带需求的Videojs-ima插件(不包括加载插件)

14

同时集成google Ima SDK和IMA DAI SDK

14

使用VideoJS Vr实现VideoJs / HolaPlayer

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档