You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:13:21