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

SAML登出的客户端与服务提供商操作及Go crewjam/saml库登出问题排查

SAMLv2 登出流程职责说明

客户端操作

  • 触发登出动作后跳转至服务端的登出发起接口
  • 跟随服务端重定向完成IDP侧的登出流程,最终跳转回服务端指定的登出完成页
  • 自行清理前端本地存储的用户状态数据

服务提供商(SP)操作

SP发起登出场景

  1. 接收客户端登出请求,从当前用户的JWT Cookie中提取SAML会话对应的NameID和SessionIndex字段
  2. 构造带签名的SAML登出请求,重定向到Keycloak的SingleLogoutService端点
  3. 接收IDP回调的登出响应,验证签名有效性确认登出完成
  4. 清理对应用户的本地会话状态

IDP发起登出场景

接收IDP主动回调的全局登出请求,验证有效性后直接销毁对应用户的本地会话,无需用户操作

crewjam/saml 库SloURL 404问题修复

SloURL仅为SP实例的配置项,用于告知IDP你的服务的登出回调地址,库本身不会自动注册对应路由,需要你手动在Web服务中绑定对应路径的处理逻辑,示例代码如下:

// 路由路径需要和你配置的SloURL路径完全一致,示例为/saml/slo
router.HandleFunc("/saml/slo", func(w http.ResponseWriter, r *http.Request) {
    // 调用库内置的SLO处理逻辑,解析IDP传来的登出请求/响应
    if err := sp.HandleSLO(w, r); err != nil {
        http.Error(w, "invalid SLO request", http.StatusBadRequest)
        return
    }
    // 登出完成后删除JWT Cookie
    http.SetCookie(w, &http.Cookie{
        Name:   "你的JWT Cookie名称",
        Value:  "",
        Path:   "/",
        MaxAge: -1,
    })
    // 重定向到登录页或站点首页
    http.Redirect(w, r, "/login", http.StatusFound)
})
核心疑问解答

如何告知IDP用户会话已终止?

需要走标准SAML 2.0登出流程:你服务端构造带签名的登出请求,携带当前用户的NameID和SessionIndex,将用户重定向到Keycloak的SLO端点,Keycloak验证请求后会销毁该用户和所有关联SP的会话,再回调你配置的SloURL通知登出完成,无需你主动调用IDP的私有接口。

JWT Cookie需要自行删除还是自动处理?

需要你自行删除。crewjam/saml库不会自动操作你自定义的JWT Cookie,你需要在登出处理逻辑的最后,设置一个过期的同名Cookie覆盖原有有效Cookie,完成本地会话清理。

内容的提问来源于stack exchange,提问作者Liam Kelly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:57:04