OpenID Connect部署中用户账户存储、OP认证及JWT组声明问询
OIDC 部署中的用户存储与认证相关问题解答
用户账户详情的存储位置(与LDAP对比)
和LDAP这种专门的目录服务不同,OIDC本身不强制规定用户数据的存储位置,这完全取决于OpenID提供商(OP)的实现:
- OP内部存储:多数OP(比如Keycloak、Auth0默认配置)自带用户数据库,直接将用户ID、密码哈希、组信息等存在自身存储系统中,LDAP反而作为可选的外部数据源存在。
- 对接外部用户源:OP也可以通过标准接口对接LDAP、AD、关系型数据库甚至第三方身份源(如微信、GitHub),此时OP本身不存储用户敏感凭据(如密码),仅在认证时转发凭据到外部源做校验。
OP如何完成用户认证
OP是OIDC流程中负责身份校验的核心角色,认证逻辑由OP自主实现:
- 若用户数据存在OP内部,OP直接校验用户输入的账号密码与存储的哈希值是否匹配;
- 若对接了LDAP/AD等外部源,OP会将用户提交的凭据转发给外部系统完成校验,拿到结果后再继续OIDC授权流程;
- 还支持无密码认证(短信验证码、生物识别)、第三方OAuth登录等方式,只要OP能确认用户身份即可。
注意:资源服务器(RS)仅负责保护API资源,不参与用户身份认证,OP不会依赖RS来校验用户身份。
给JWT添加缺失的组信息声明
如果组信息未默认包含在JWT声明中,可通过以下方式添加:
- 配置OP声明映射:在OP的管理控制台(比如Keycloak的「客户端范围」配置),将用户的组字段映射为标准或自定义声明(如
groups),同时确保授权请求中包含对应的scope(比如自定义的groupsscope)。 - 扩展OP逻辑:若OP支持扩展(如Keycloak的SPI、Auth0的规则),可编写代码从用户存储中读取组信息,手动添加到JWT的
claims集合中。 - 授权请求指定声明:在依赖方(RP)发起授权请求时,通过
claims参数明确要求返回组信息,示例:
只要OP支持该参数,就会将组信息加入JWT。claims={"groups": {"essential": true}}
内容的提问来源于stack exchange,提问作者JBravo
相关产品推荐
相关产品推荐

