Iris 本身不提供 SSO 支持,因其定位是轻量级 Web 框架,仅专注路由、中间件与渲染,不内置 OAuth2/OIDC/SAML 协议实现,SSO 需自行集成标准 OIDC 流程。

为什么 Iris 本身不提供 SSO 支持
Iris 是一个轻量、高性能的 Go Web 框架,它不内置 OAuth2、OIDC 或 SAML 协议实现,也没有 SSOClient 或 SSOServer 这类抽象组件。它的定位是“路由 + 中间件 + 渲染”,认证逻辑必须由你自行集成。直接在 Iris 里调 ctx.Login() 或塞个 session.Set("user_id", ...) 只能做单服务登录,跨域、跨子域、跨语言系统无法共享登录态。
用 OIDC 接入标准 SSO 中心最可行
主流 SSO 方案(如 Keycloak、Auth0、腾讯云 CODING IAM、阿里云 IDaaS)都支持 OIDC Provider(OP)角色。Iris 应作为 RP(Relying Party)通过 golang.org/x/oauth2 + coreos/go-oidc 完成授权码流程。关键不是“怎么写中间件”,而是“怎么安全地交换和校验 ID Token”。
- 必须用
oidc.Provider的Verifier校验id_token签名与有效期,不能手动解析 JWT 后比对exp - 回调地址(
redirect_uri)必须精确匹配 SSO 后台注册值,且需是 HTTPS(本地开发可用http://localhost:8080/callback) - 用户信息应从
id_token(经 verifier 解析后)或/userinfo端点获取,而非依赖access_token自行调 API - Session 存储建议用
iris.Sessions().Start(ctx)配合 Redis 后端,避免内存 session 导致多实例登录态不一致
常见错误:Cookie 跨子域失效
SSO 登录后跳回 app.example.com,但 session cookie 默认作用域是 app.example.com,导致 api.example.com 读不到登录态。这不是 Iris 的 bug,是 Cookie 作用域规则:
- 设置
iris.CookieOptionDomain(".example.com")(注意开头的点) - 确保所有子域使用同一
SessionID生成密钥(iris.Sessions().Configure(...)中的Secret必须一致) - 若前端用
fetch调 API,需带credentials: "include",且后端响应加ctx.Header("Access-Control-Allow-Credentials", "true") - 避免在
localhost下测试跨子域——浏览器不支持.localhost域名,得用host.docker.internal或改 hosts 绑定真实域名
登出要调两次:本地 Session + SSO Provider
仅清空 Iris 的 session 并不能让 SSO 中心注销用户,下次访问仍会自动登录。完整登出链路是:
立即学习“go语言免费学习笔记(深入)”;
- 调用
ctx.Session().Destroy()清除本地 session - 重定向到 SSO 的
end_session_endpoint(OIDC 规范定义),附上id_token_hint和post_logout_redirect_uri - 注意:部分 SSO(如 Keycloak)要求
post_logout_redirect_uri必须提前在后台白名单注册 - 不要依赖前端 JS 调 logout 接口——登出必须是服务端发起的 302 重定向,否则存在 CSRF 风险
真正难的不是代码几行,是每个环节的协议细节和部署约束:OIDC discovery URL 是否可公开访问、JWKS URI 是否带鉴权、clock skew 如何容忍、refresh token 是否启用……这些地方错一点,整个 SSO 就表现为“有时能登、有时 401、有时跳转循环”。


















