切换主题
IAM 与 Gateway 接入
接入顺序
- 为 Web 注册独立 SPA 公共客户端,使用 Authorization Code + PKCE S256。
- 精确登记每个环境的回调 URI,并在 Gateway 配置实际 Web Origin。
- 实现 state 校验、授权码交换、令牌刷新与统一退出。
- 后端配置 Resource Server 验证 issuer、JWK 签名与令牌有效期。
- 声明应用权限与角色,在每个租户业务查询中施加租户与数据范围条件。
- 为 Gateway 添加业务路由,并验证非授权与跨租户请求被拒绝。
SPA 登录
浏览器不持有 Client Secret,不自行收集或校验企业密码。参考当前应用的 auth.ts 和认证回调实现;授权事务只能使用一次,站内返回地址必须受限。
ts
const body = new URLSearchParams({
grant_type: 'authorization_code',
client_id: 'edma-example-web',
code,
redirect_uri: `${window.location.origin}/auth/callback`,
code_verifier: verifier,
})
const response = await fetch(`${gatewayUrl}/oauth2/token`, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body,
})上例只展示授权码交换;code 必须来自已通过 state 校验的当前回调,verifier 来自本次授权事务。不要把令牌或 verifier 写进日志。
后端验证
yaml
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: ${EDMA_IAM_ISSUER:http://localhost:6100}
jwk-set-uri: ${EDMA_IAM_INTERNAL_URL:http://localhost:6112}/oauth2/jwksSpring Security 的 JWT 校验只是身份基础;还需按当前应用规则映射业务权限、校验授权版本、角色数据范围和对象状态。不能因前端隐藏按钮就省略后端授权。
tenant_id 来自已验证 JWT。Gateway 的 X-Edma-* 身份头仅作辅助上下文,不能单独成为授权依据。
服务间调用
使用独立 SERVICE 客户端和 Client Credentials。对租户业务接口,客户端应被显式授予对应 tenant:<UUID> scope,每次令牌请求选择一个租户;同时校验服务 scope、客户端归属与 grant type。
需要用户权限的文件访问等场景转发原用户令牌,不用强权限服务令牌替代用户授权。
验收
检查精确回调、state 一次性、刷新失败降级、统一退出、越权动作、伪造身份头、错误租户和失效令牌。生产签名密钥与轮换应按当前 IAM 配置和部署方案确认。