带有 'refresh_token' grant_type 的 Keycloak 离线访问令牌

Keycloak Offline Access token with 'refresh_token' grant_type

我正在尝试通过以下请求从 Keycloak 获取离线访问权限:

curl -X POST https://<domain>/auth/realms/public/protocol/openid-connect/token 
  -H "Content-Type: application/x-www-form-urlencoded"
  -d 'grant_type=refresh_token'
  -d "refresh_token=<token>"
  -d 'scope=offline_access'
  -d 'client_id=<id>'
  -d 'client_secret=<secret>'

响应中的 scope 不是我预期的 offline_access,而是 openid,而且管理控制台中的离线令牌数也没有更新。

{
  "access_token": <access token>,
  "expires_in": 3600,
  "refresh_expires_in": 84884,
  "refresh_token": <refresh token>,
  "token_type": "bearer",
  "id_token": <id token>,
  "not-before-policy": 0,
  "session_state": <state>,
  "scope": "openid"
}

如何使用 grant_type 'refresh_token' 获取离线访问令牌?

请注意,我可以使用 grant_type password 获取它们,但我不想使用它,因为:

通常 offline_access 需要在原始授权请求中指定 - 在授权时 - 在某些设置中还涉及用户同意离线使用令牌。

尝试像这样获取刷新令牌,当完成授权时:

curl -X POST https://<domain>/auth/realms/public/protocol/openid-connect/token 
  -H "Content-Type: application/x-www-form-urlencoded"
  -d 'grant_type=authorization_code'
  -d 'code=<code>'
  -d "redirect_uri=<uri>'
  -d 'scope=openid offline_access'
  -d 'client_id=<id>'
  -d 'client_secret=<secret>'

然后省略您发布的刷新令牌授予请求中的范围参数。范围参数通常不在此消息中指定。如果是,那么它只能用于缩小委托范围。也就是说,您无法静默获取用户未同意的新范围。