Android WebView集成Keycloak登录,AccessToken缺失用户信息的解决咨询
解决WebView集成Keycloak后AccessToken无用户信息的问题
首先你犯了一个关键错误:换取Token时用了client_credentials授权类型,这是客户端凭证模式,完全是客户端自身的身份认证,和用户无关,所以返回的AccessToken自然不会包含任何用户信息。你需要用授权码模式对应的grant_type=authorization_code来换取Token,这才是和WebView里的用户登录流程匹配的模式。
第一步:修正Token换取请求参数
调用myRealm/protocol/openid-connect/token接口时,参数要改成这样:
client_id=Android grant_type=authorization_code client_secret=xxx-xxx-xx--- code=(从重定向URL获取的code) redirect_uri=(必须和你Keycloak客户端配置的redirect_uri一致,比如你的Android应用自定义Scheme链接)
注意:redirect_uri必须和你在Keycloak后台给Android客户端配置的回调地址完全匹配,否则会报错。
第二步:配置Keycloak客户端的用户信息映射器
即使修正了授权类型,有时候默认的AccessToken也不会包含所有用户字段,需要手动添加映射器:
- 登录Keycloak管理控制台,进入你的
myRealm域 - 左侧菜单选择Clients,找到你的
Android客户端并进入 - 切换到Mappers标签页,点击Create按钮添加映射器
- 针对需要的用户字段分别配置:
- 用户名映射器:
- Name: 自定义名称(比如Username Mapper)
- Mapper Type: User Property
- Property: username
- Token Claim Name: username
- Claim JSON Type: String
- 勾选Add to access token
- 邮箱映射器:
- Name: 自定义名称(比如Email Mapper)
- Mapper Type: User Property
- Property: email
- Token Claim Name: email
- Claim JSON Type: String
- 勾选Add to access token
如果还有其他用户字段(比如昵称、姓名),按同样方式添加即可。
- 用户名映射器:
第三步:验证配置
重新走一遍WebView登录流程:
- 用WebView打开授权页面,完成用户登录
- 获取重定向URL里的
code - 用修正后的参数调用Token接口
- 解析返回的AccessToken,应该能看到
username、email等用户字段了
另外补充:如果你的Android客户端是公共客户端(比如没有client_secret的移动端应用),要在Keycloak客户端配置里把Access Type改成public,并且关闭Client Authentication选项,此时Token请求里不需要传client_secret参数。
内容的提问来源于stack exchange,提问作者Harish Padmanabh
相关产品推荐
相关产品推荐

