Keycloak调用/userinfo接口返回401(USER_INFO_REQUEST_ERROR)求助
本地通过以下Docker命令部署Keycloak 20.0.1:docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:20.0.1 start-dev
已成功获取Bearer Token,Payload显示Token有效,但调用接口http://127.0.0.1:8080/realms/dialog-feat/protocol/openid-connect/userinfo时返回401状态码,错误日志如下:type=USER_INFO_REQUEST_ERROR, realmId=(...), clientId=null, userId=null, ipAddress=(...), error=access_denied, auth_method=validate_access_token
用Access Token而非ID Token发起请求
UserInfo接口只接受Access Token,ID Token仅用于身份验证,无访问该接口的权限。区分两者:Access Token的Payload包含scope、client_id字段;ID Token则包含email、name等用户信息以及nonce、at_hash字段。确保获取Token时请求了正确的Scope
获取Token的请求必须携带scope=openid(必填),如需更多用户信息可追加profile、email等参数。缺少openidscope会导致Keycloak拒绝UserInfo请求。检查客户端配置
- 登录Keycloak后台,进入
dialog-featrealm,找到对应客户端。 - 确认Access Type配置:若为Public客户端,必须填写有效的Valid Redirect URIs(本地测试可填
http://localhost/*,不能留空);若为Confidential客户端,需确保客户端密钥配置正确,且获取Token时使用了对应的认证方式。 - 切换到Client Scopes标签,确认
openid、profile等必要范围已添加,且处于Assigned Default Scopes列表中。
- 登录Keycloak后台,进入
验证请求头格式
调用接口时,Authorization请求头必须严格遵循格式:Bearer <你的Token>,注意Bearer与Token之间有且仅有一个空格,无多余符号或空格。确认Token有效性
即使Payload显示有效,仍需检查:exp字段是否晚于当前时间,确保Token未过期;- 通过Keycloak的JWKS端点
http://127.0.0.1:8080/realms/dialog-feat/protocol/openid-connect/certs验证Token签名是否正确。
内容的提问来源于stack exchange,提问作者Альберт Александров

