Я устанавливаю обратный прокси-сервер Nginx, который направляет запросы к различным базовым микросервисам на основе пути. Кроме того, перед маршрутизацией запросов я бы хотел, чтобы Nginx проверил действительность маркера oauth, переданного в заголовке запроса. Я использую Keycloak в качестве oauth-сервера, хотя я мог анализировать токен из других приложений (и почтальона), и мне трудно реализовать его в Nginx.
nginx.conf
map $http_authorization $token {
~*^Bearer\s+([\S]+)$ $1;
}
location / {
auth_request /auth;
error_page 401 =401 /auth;
proxy_pass http://backend-api/;
}
Блок проверки токена
location = /auth {
# internal;
gunzip on;
proxy_method POST;
proxy_set_header Authorization "Basic base64encoded-uid-pwd";
proxy_set_header Content-Type "application/x-www-form-urlencoded";
proxy_set_body "token=$token";
proxy_pass https://keycloak-server/auth/realms/myrealm/protocol/openid-connect/token/introspect;
# proxy_cache token_responses; # Enable caching of token introspection responses
# proxy_cache_key $access_token; # Cache the response for each unique access token
# proxy_cache_lock on; # Don't allow simultaneous requests for same token
# proxy_cache_valid 200 10s; # How long to use cached introspection responses
# proxy_cache_use_stale error timeout; # Use old responses if we cannot reach the server
# proxy_ignore_headers Cache-Control Expires Set-Cookie; # Cache even when receiving these
}
Nginx отправляет запрос на сервер Keycloak, я проверил журнал, но получаю ответ об ошибке ниже от Keycloak
{
"active": false
}
Я обнаружил, что эта ошибка произошла из-за того, что токен неправильно передан в качестве параметра body в запросе. Чего мне не хватает в сценарии? На самом деле мне нужно взять только токен аутентификации, переданный в заголовке Authorization
, и передать его серверу Keycloak в параметре body.
PS: Keycloak ожидает жетон oauth как param в теле x-www-form-urlencoded
как token
.