You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OIDC中间件配置中仅保留ID Token并移除Access Token

移除OIDC认证Cookie中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:52:50