Keycloak未返回refresh_token,如何获取该令牌?
解决Keycloak未返回refresh_token的问题
问题根源
你当前使用的是OIDC Implicit Flow(请求中response_type=id_token+token),按照OIDC规范,这个流程是为纯前端无后端应用设计的,出于安全考虑,默认不会返回refresh_token——浏览器环境无法安全存储敏感的refresh_token,容易遭XSS攻击窃取。
解决方案
方案1:切换到Authorization Code Flow(推荐,安全合规)
这是OIDC生产环境的标准流程,需要后端配合完成:
- 修改认证请求的
response_type参数为code,把原URL中的response_type=id_token+token替换为response_type=code - 用户授权后,前端会拿到一个授权码(
code),将这个code传给你的后端服务 - 后端调用Keycloak的Token端点(
POST https://URL/auth/realms/XXX/protocol/openid-connect/token),携带以下参数换取完整token:
此时接口会返回包含client_id=你的客户端ID client_secret=你的客户端密钥(仅后端持有,不能暴露给前端) grant_type=authorization_code code=前端拿到的授权码 redirect_uri=和认证请求一致的回调地址refresh_token的完整响应。
方案2:在Implicit Flow中启用refresh_token(不推荐,存在安全风险)
如果因业务限制必须使用Implicit Flow,可按以下步骤操作:
- 登录Keycloak控制台,进入对应客户端的配置页面
- 在「高级」标签下,找到「Implicit Flow Allow Refresh Token」选项并勾选开启
- 修改认证请求的
scope参数,添加offline_access,把原URL中的scope=openid改为scope=openid offline_access - 重新发起认证请求,此时响应中会包含
refresh_token
注意:此方案会将
refresh_token暴露在浏览器的URL片段或本地存储中,存在被XSS攻击窃取的风险,仅建议在低安全要求场景使用。
内容的提问来源于stack exchange,提问作者renesahmkow
相关产品推荐
相关产品推荐

