У меня есть модуль авторизации, который вызывается всякий раз, когда делается запрос к частной конечной точке.
Модуль анализирует токен из Authorization
заголовок и:
Authorization
заголовок."profile" - это одна из частных конечных точек, настроенная следующим образом:
location /profile {
auth_request /jwtverify;
auth_request_set $authorization $upstream_http_authorization;
proxy_set_header authorization $authorization;
proxy_pass http://private-profile:80;
}
jwtverify
настраивается так:
location = /jwtverify {
internal;
proxy_pass http://auth-module:8080/auth/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
auth_request_set $http_authorization $upstream_http_authorization;
}
Теперь все работает, кроме требования no. 3: если модуль auth устанавливает Authorization
заголовок, клиент никогда его не получит.
Поток должен быть таким:
auth-module
перехватывает запрос и, если он действителен, прокси передает его частной службеauth-module
необходимо сохранить и отправить клиентуДумаю, я не понял толком, как сочетать auth_request_set
, proxy_set_header
, auth_request_set
, также может быть, что они не подходят для этого сценария.
Есть ли способ сделать это в NGINX?
Хорошо, я смог это сделать с помощью headers_more
модуль.
Полная конфигурация:
location = /jwtverify {
internal;
proxy_pass http://auth-module:8080/auth/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
location /profile {
auth_request /jwtverify;
# this gets called right after auth_request returns.
# it reads http "authorization" header from upstream (= auth_request)
# and sets it to the variable $auth_header
# https://stackoverflow.com/a/31485557/1759845
auth_request_set $auth_header $upstream_http_authorization;
# this gets called right before sending response to client.
# it adds the previously set variable (= "authorization"
# header from auth_request) to the response
more_set_headers "Authorization: $auth_header";
proxy_pass http://private-profile:80;
}