Keycloak 19命令行获取offline_access token失败,仅获普通access_token
解决Keycloak 19获取离线令牌(offline_access)的问题
首先明确:offline_access对应的是离线刷新令牌(refresh_token),而非让access_token本身长期有效。access_token默认短有效期(300秒)是OAuth2的标准设计,离线令牌的作用是用长期有效的refresh_token在access_token过期后刷新获取新的access_token。
以下是排查和解决步骤:
1. 检查客户端核心配置
- 确认客户端的Access Type为
confidential(你已使用client_secret,此配置大概率没问题,但需验证) - 确保Direct Access Grants Enabled已开启(password授权模式必须开启此选项)
- 在客户端的Client Scopes页,确认
offline_access已添加为Default Scope或Optional Scope,且未被移除 - 检查客户端的Advanced Settings:
- 确认Refresh Token Enabled处于开启状态
- 查看Offline Session Idle Time和Offline Session Max Lifespan,确保设置为合理时长(默认30天,若设为5分钟会导致离线令牌快速失效)
2. 验证用户权限配置
- 确认给用户添加的
offline_access是Realm级角色,而非客户端自定义角色(offline_access是Keycloak内置的Realm角色) - 进入用户详情页的Role Mappings,切换到Effective Roles,确认能看到realm的
offline_access角色(避免添加角色时选错范围)
3. 验证请求与返回结果
你的curl请求参数是正确的,调用后需检查返回体:
若返回结果包含
refresh_token字段,说明离线令牌已生成。你可以用该refresh_token调用刷新接口获取新的access_token:curl --location --request POST http://localhost:8080/realms/adnetwork/protocol/openid-connect/token \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=refresh_token' \ --data-urlencode 'client_id=someclientid' \ --data-urlencode 'client_secret=someclientsecret' \ --data-urlencode 'refresh_token=替换为你的refresh_token'若能成功返回新的access_token,说明离线令牌功能正常,access_token短有效期是预期行为。
若返回结果无
refresh_token,需检查:- Realm级的Token Settings中,Offline Session Idle Time是否被设为0或极短时长
- 用户是否被标记为Disabled或存在其他会话限制
常见误解纠正
offline_access权限不会改变access_token的有效期,它仅允许生成长期有效的refresh_token,以此在用户离线时持续获取新的access_token。这是OAuth2协议的标准设计,目的是平衡安全性与可用性。
内容的提问来源于stack exchange,提问作者Oriol Gallart
相关产品推荐
相关产品推荐

