Keycloak Gatekeeper обновляет токен, но не добавляет его в запрос

Куда мне нужно отправить запрос на обновление токена доступа? Потому что, если я отправлю запрос в службу ресурсов, у меня будет исключение с истекшим сроком действия токена, даже если привратник обновит токен.

Я хочу обновить токен доступа с помощью токена обновления. В документации привратника говорится: «Если запрос на токен доступа содержит токен обновления, а для параметра --enable-refresh-tokens установлено значение true, прокси автоматически обновит токен доступа для вас». - https://www.keycloak.org/docs/latest/securing_apps/index.html#refresh-tokens

И действительно, когда токен истек, привратник обновляет токен доступа и вводит его где-то в ответ, но когда запрос перенаправляется в службу ресурсов, у меня есть ExpiredJwtException, потому что в запросе нет нового обновленного токена. И в неудачном ответе я вижу, что вместо нового токена используется старый. Однако, если на стороне службы ресурсов возникает ошибка тайм-аута и привратник возвращает свой ответ пользователю, я вижу, что токены доступа и обновления обновляются.

Вот логи привратника:

1.5732098220167706e+09  info    keycloak-gatekeeper/middleware.go:154   accces token for user has expired, attemping to refresh the token   {"client_ip": "172.18.0.1:36270", "email": "[email protected]"}
1.5732098220504465e+09  info    keycloak-gatekeeper/middleware.go:206   injecting the refreshed access token cookie {"client_ip": "172.18.0.1:36270", "cookie_name": "kc-access", "email": "[email protected]", "refresh_expires_in": 3600, "expires_in": 59.949554727}
1.573209822050499e+09   debug   keycloak-gatekeeper/middleware.go:226   renew refresh cookie with new refresh token {"refresh_expires_in": 3600}
1.5732098220505428e+09  debug   keycloak-gatekeeper/middleware.go:367   access permitted to resource    {"access": "permitted", "email": "[email protected]", "expires": -5.050542554, "resource": "/*"}
1.573209851051063e+09   info    keycloak-gatekeeper/middleware.go:90    client request  {"latency": 29.036757293, "status": 500, "bytes": 44, "client_ip": "172.18.0.1:36270", "method": "GET", "path": "/ping"}

person Дмитрий Умецкий    schedule 08.11.2019    source источник


Ответы (1)


Маркер обновления хранится в зашифрованном виде в kc-state cookie, который находится в Set-Cookie HTTP-заголовке. Чтобы переслать этот запрос, вам нужно добавить параметр kc-state в HTTP-заголовок Cookie.

См. https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies:

HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: kc-state=blabla
Set-Cookie: another-cookie=yadada

GET /sample_page.html HTTP/2.0
Host: www.example.org
Cookie: kc-state=blabla; another-cookie=yadada

Если у вас есть интерфейс, заголовок Cookie будет добавлен автоматически.

person Erwin Rooijakkers    schedule 28.10.2020