logto 是符合 oidc 规范的认证服务而非代理,erp 鉴权需在 go 网关层动态校验其 rs256 jwt(通过 oidc discovery 获取 jwk)、严格验证 aud/iss、注入用户上下文,并结合 redis 黑名单与 casbin 实现权限控制。

Logto 本身不是传统意义上的“代理”,它是一个开源的、符合 OIDC 规范的认证服务(Auth Server),不能直接当反向代理或网关用。你在 ERP 系统里想用它做鉴权,核心不是“集成 Logto 作为代理”,而是让 ERP 的网关或服务层信任 Logto 签发的 OIDC Token,并完成校验与上下文注入。
你真正要解决的是:如何让 Go 编写的 ERP 后端(比如基于 gin 或 echo 的 API 层)安全、可靠地验证来自 Logto 的 access_token,并据此放行或拒绝请求。
Logto 的 token 不是 JWT 就能直验 —— 必须用 OIDC Discovery 动态获取公钥
Logto 默认签发 RS256 签名的 JWT,且密钥轮换频繁。硬编码 publicKey 或静态配置 JWK Set URL 极易失效。
- 必须通过 Logto 提供的 OIDC Discovery endpoint(如
https://logto.example.com/oidc/.well-known/openid-configuration)动态获取jwks_uri - 使用
golang-jwt/jwt/v5+github.com/lestrrat-go/jwx/v2/jwk组合实现自动 JWK 刷新(建议每 1 小时 reload 一次,TTL 设为 24h) - 校验时必须显式指定
Audience:Logto 的access_token的aud字段默认是 client ID,你的 ERP 网关需在验证时传入匹配值,否则VerifyAudience失败 - 别忽略
iss校验:必须严格等于 Logto 的 issuer URL(如https://logto.example.com),大小写敏感,末尾斜杠不能省
Go 网关层如何拦截并注入用户上下文 —— 不要让每个 service 自己验 token
ERP 内部通常有多个子服务(如 finance、inventory、hr),它们不该各自解析和校验 JWT。正确做法是:由统一网关(如自研 gin 中间件或 Kratos Gateway)完成鉴权,并透传可信头。
- 中间件中调用
ParseRequestToken解析Authorization: Bearer xxx,失败则直接返回401 - 成功后从 token 中提取
sub(用户唯一 ID)、roles(数组)、permissions(可选),写入context.Context或设置请求头(如X-User-ID、X-Roles) - 下游服务只读这些头,不做任何 JWT 解析——避免重复逻辑、密钥泄露、签名绕过
- 注意:Logto 的
access_token默认不含角色信息;需在 Logto 后台配置Resource Server并启用RBAC插件,或通过OIDC Scope请求rolesclaim
Logto 登出后 token 仍有效?必须配合 Redis 黑名单 + short-lived token
Logto 的 access_token 默认 TTL 是 1 小时,且无主动吊销机制。ERP 场景下用户点击“退出登录”后,若不干预,token 在过期前仍可访问所有接口。
- Logto 自身提供
/oidc/revokeendpoint,但只支持refresh_token吊销;access_token无法实时废止 - 务实方案:网关层在每次鉴权前,先查 Redis key
blacklist:token:<code>jti,存在则拒访;登出时由前端调用 ERP 的/auth/logout接口,该接口向 Logto 调/oidc/revoke并同时写入黑名单(TTL = token 剩余有效期) - 更轻量做法:把
access_tokenTTL 缩短到 15 分钟,并依赖 Logto 的 session 管理(用户登出后 session 失效,新 token 拿不到) - 别依赖
exp单一判断——攻击者截获短期 token 仍可重放,黑名单是底线防护
Logto 用户属性映射到 ERP 权限系统 —— 避免硬编码 role 名称
Logto 的用户 profile 是动态的,角色名(如 "erp-finance-admin")可能随组织架构调整而变。直接在代码里写 if role == "admin" 会迅速腐化。
- 推荐用 Casbin 做 ABAC + RBAC 混合:策略规则存 etcd/MySQL,如
p, role:erp-finance-admin, /api/v1/invoice, POST, allow - 网关从 token 解出
roles后,调用enforcer.Enforce(userID, resourcePath, method),而非字符串匹配 - Logto 的 custom claims(如
x-erp-dept)可通过其 Hook 或 Resource Server 扩展注入,用于细粒度策略(例如:“仅财务部华东区人员可导出报表”) - 切忌把权限判断逻辑散落在各 controller 里——网关统一 enforce,服务层只接收已授权的 context
Logto 和 ERP 的边界必须划清:Logto 只管“你是谁、有哪些身份标签”,ERP 网关负责“这些标签在当前接口下意味着什么权限”。任何试图让 Logto 承担 ERP 业务权限决策的做法,都会导致耦合加深、升级困难、审计失真。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











