Iris 本身不支持 SSO,需通过中间件对接外部 IdP(如 Keycloak、Azure AD)实现 OIDC 流程;正确做法是用 golang.org/x/oauth2 和 go-oidc 校验 token、持久化 session、调用 IdP 登出端点。

SSO 不是 Iris 自带功能,得靠中间件和外部认证服务协同实现
Iris 本身不提供 SSO 协议(如 SAML、OIDC)的原生支持,它只是一个 HTTP 路由与中间件框架。真正做单点登录,必须对接 Identity Provider(IdP),比如 Keycloak、Auth0、Azure AD 或自建 OIDC 服务。Iris 的角色是:接收 IdP 回调、验证 token、维护本地会话、透传用户上下文。
常见错误是试图在 Iris 里“手写 SAML 解析”或“自己签发 JWT 并当 IdP 用”——这既不安全也不符合 SSO 设计原则。正确路径是让 Iris 做 SP(Service Provider)端的轻量适配。
用 golang.org/x/oauth2 实现 OIDC 登录流程最稳妥
OIDC 是当前 Web SSO 最主流、Iris 生态最易集成的方案。核心依赖是 golang.org/x/oauth2 + github.com/coreos/go-oidc(用于校验 ID Token)。不要用过时的 go-oidc v1 或自行解析 JWT header/payload。
关键实操点:
-
oauth2.Config的RedirectURL必须和 IdP 后台注册的完全一致(含 http/https、端口、路径),否则回调失败报invalid_request - ID Token 验证必须调用
verifier.Verify(ctx, rawIDToken),不能只 base64 解码后取exp字段——否则绕过签名校验,存在严重安全风险 - Iris 中建议把 OAuth2 配置封装成结构体,避免全局变量污染;token exchange 和用户信息获取应放在独立 handler,别塞进中间件里
- 示例回调处理片段:
func oauthCallback(ctx iris.Context) { state := ctx.URLParam("state") if state != ctx.Session().GetString("oauth_state") { ctx.StatusCode(400) ctx.WriteString("invalid state") return } token, err := oauth2Config.Exchange(ctx.Request().Context(), ctx.URLParam("code")) // ... 校验 ID Token、获取用户信息、写入 session }
Session 共享是 SSO 落地的关键瓶颈,别依赖默认内存存储
如果你有多个 Iris 实例(比如用 nginx 做负载均衡),默认的内存 session 会导致用户在 A 实例登录后,跳转到 B 实例时 session 丢失,被迫重新登录——这直接破坏 SSO 体验。
必须换持久化 session 存储:
- 开发环境可用
redis(推荐github.com/kataras/iris/v12/sessions/redis),注意设置Expiration和Cookie.Secure(HTTPS 下必须为 true) - 生产环境若用 Kubernetes,可考虑
redis或memcached;避免用文件系统或数据库存 session——延迟高、并发差 - session key 命名要有业务前缀,比如
sso_user_id,避免和其他模块冲突;清除 session 时用sess.Destroy(),别只删某个字段 - 不要在 session 里存敏感字段(如原始 ID Token),只需存
user_id、email、roles等必要信息
登出要调 IdP 的 end_session_endpoint,不能只清本地 session
只执行 ctx.Session().Destroy() 只是断开了当前应用的会话,IdP 上的主会话依然有效。用户再访问其他接入同一 IdP 的系统,会自动登录,根本没“登出”。
正确做法是构造重定向到 IdP 的登出 URL:
- OIDC 协议要求 IdP 提供
end_session_endpoint(在/.well-known/openid-configuration里) - 重定向时需带上
id_token_hint(原始 ID Token)和post_logout_redirect_uri(必须提前在 IdP 注册) - Iris 中不要用
ctx.Redirect()后立刻返回,确保重定向响应已发出;可加日志记录登出请求是否触发成功 - 如果 IdP 不支持标准登出(如某些老版本 Keycloak),只能降级为“前端跳转到 IdP 登录页 + 清本地 session”,但要明确告知用户这只是局部登出
SSO 的复杂度不在 Iris 代码行数,而在 IdP 配置细节、token 生命周期对齐、跨域 Cookie 策略、以及登出时序。最容易被忽略的是:测试阶段用 Chrome 而不用无痕窗口,结果因第三方 Cookie 限制导致回调失败,误以为是代码问题。











