如何在OIDC中间件配置中仅保留ID Token并移除Access Token
现状与需求
当前使用Okta OIDC中间件,配置如下:
oidcConfig = { issuer: configObj.oktaIssuer, client_id: global.configuration.oktaClientId, client_secret: global.configuration.oktaClientSecret, appBaseUrl: configObj.appBaseUrl, scope: 'openid', // 已移除profile作用域 response_type: 'code', loginRedirectUri: configObj.appBaseUrl+'/authorization-code/callback', routes: { callback: { defaultRedirect: '/' }, login: { path: '/signin', }, loginCallback: { afterCallback: '/application/dashboard' } } };
Cookie会话配置:
nodeApp.use( cookieSession({ httpOnly: true, name: 'sample', keys: ['xxx', 'xxxx'], signed: true, // Cookie Options maxAge: 8 * 60 * 60 * 1000, // 8 hours }) );
需求:仅在Cookie中保留ID Token(用于登出),移除Access Token。
具体实现思路
1. 利用OIDC中间件的会话过滤配置
大部分OIDC中间件(如Okta官方的Express OIDC中间件)支持通过session配置项指定要存储的字段,直接排除access_token:
oidcConfig = { // 原有配置... session: { // 仅保留id_token,不存储access_token keys: ['id_token'] }, // 原有路由配置... };
2. 在回调后手动清理会话字段
如果中间件不支持会话过滤,可在afterCallback钩子中手动删除会话里的Access Token:
oidcConfig = { // 原有配置... routes: { // 原有路由配置... loginCallback: { afterCallback: (req, res, next) => { // 根据中间件实际存储路径调整,通常在req.session.oidc下 delete req.session.oidc?.accessToken; next(); } } } };
3. 自定义会话序列化逻辑(若基于Passport.js)
如果你的OIDC集成基于Passport.js,重写serializeUser方法,只序列化ID Token相关数据:
passport.serializeUser((user, done) => { // 仅保留id_token,丢弃其他字段 done(null, { id_token: user.id_token }); });
4. 回调路由中手动清理会话
直接在认证回调路由里修改会话,删除不需要的字段后保存:
app.get('/authorization-code/callback', async (req, res) => { // 完成认证流程后执行清理 delete req.session.accessToken; // 或对应中间件的存储字段,如req.session.okta?.accessToken await req.session.save(); res.redirect('/application/dashboard'); });
注意:不同OIDC中间件的会话字段命名可能有差异,比如部分中间件会把OIDC数据存在req.session.oidc对象下,需要根据实际使用的中间件调整字段路径。
内容的提问来源于stack exchange,提问作者sunny
相关产品推荐
相关产品推荐

