OIDC的UserInfo端点
OIDC是OAuth2的一个扩展,用于获取用户信息,如用户名、邮箱等,获取其他定制的用户信息需要自定义 UserInfo 端点。
1.UserInfo 端点谁调用:
/userinfo 由 OIDC 客户端(RP) 调用,不是浏览器、也不是资源服务器。在你们的架构里就是 BFF(inventory-app / order-app),
以服务端到服务端方式带着 Access Token 调用:
GET {issuer}/userinfo
Authorization: Bearer <access_token>
2.UserInfo 端点什么时候调用:
时机 1:OIDC 登录流程中(最常见)
授权码流程换完 token 之后,客户端如果想补充用户资料,就会调一次。如果 BFF 用的是 Spring Security 的 oauth2Login(),框架的
OidcUserService 会在登录处理时自动调它------条件是:Provider 元数据(/.well-known/openid-configuration)里声明了 userinfo 端点
请求的 scope 包含 openid + profile/email/address/phone 之一调回来的 claims 会合并进 OidcUser,用于建立登录会话。
时机 2:按需随时调用
端点不会主动推送,客户端任何时候需要用户资料都可以调,典型场景:只有 Access Token、没有 ID Token 的纯 OAuth2 场景需要比 ID Token 更
全/更新的资料(ID Token 只是签发时刻的快照)前端 SPA 登录后拉取用户 profile 展示
当前实际状况:
项目使用的是 Spring Authorization Server 通过 .oidc(Customizer.withDefaults()) 启用的默
认 UserInfo 端点(/userinfo)。默认行为是从 ID Token 的 claims 中返回用户信息。而你的定制用户信息(tenant_id、
tenant_code、tenant_name、roles)是通过 jwtTokenCustomizer() 直接写入 ID Token 的,并没有走 UserInfo 端点。由于默
认 UserInfo 端点会从 ID Token claims 取值,这些定制信息也会随默认 /userinfo 端点返回。
如果将来需要完全自定义 UserInfo 返回内容(例如按 scope 过滤、增加新字段),才需要提供自定义的 OidcUserInfoMapper Bean。