按理说是一个很容易修复的bug,一方面由于是集成其他服务,debug起来不方便,只能对着服务返回不完整日志定位问题;OIDC疑似会在响应的Header里返回一些提示信息,告诉是缺少openid
scope导致的403 Forbidden
错误,但响应太长还真没注意到()另一方面就是OIDC
涉及到知识盲区了,没踩坑经验
Keycloak 的 UserInfo 端点要求 Access Token 必须包含 openid
scope,否则会返回 403 Forbidden
错误。这是 OpenID Connect 协议规范的要求,确保只有经过身份验证的令牌才能访问用户信息。详情可见Securing applications and services with OpenID Connect - Keycloak & Final: OpenID Connect Core 1.0 incorporating errata set 2
部分 Keycloak 配置下,Access Token 的 JWT payload 可能未直接包含 scope 字段,但只要申请 token 时带上了 openid
scope,UserInfo 端点即可正常使用。可以参考如下python代码
import requestsdef get_access_token(): client_id = 'your client id' client_secret = 'your client secret' url = 'https://{your-keycloak-server}/auth/realms/{your-realm}/protocol/openid-connect/token' headers = {"Content-Type": "application/x-www-form-urlencoded"} payload = { "grant_type": "client_credentials", "client_id": client_id, "client_secret": client_secret, "scope": "openid" # ❗️ 确保包含 openid scope } resp = requests.request("POST", url, headers=headers, data=payload) content = resp.json() return content['access_token']def request(): access_token = get_access_token() url = 'your request url' headers = {'Authorization': f'Bearer {access_token}'} resp = requests.request(method, url, headers=headers)
在请求体中添加 scope=openid
,确保 Access Token 包含 openid
scope。在JSON Web Tokens - jwt.io解码 Access Token 后,可以看到新生成的 Access Token 在scope
这个Claim中包含了openid
左侧/右侧分别为未包含/包含 openid scope
的 token
JWT
OIDC 与 OAuth2.0 综述 | Authing 文档
Keycloak UserInfo 端点403 Forbidden 错误解决