Передавая заголовки из auth_request
У меня есть модуль авторизации, который вызывается всякий раз, когда делается запрос к частной конечной точке.
Модуль анализирует токен из Authorization
заголовок и:
- если он недействителен, он возвращает 401
- если он действителен, он возвращает 200
- если он действителен, но истекает через X минут, он генерирует новый токен и возвращает его в
Authorization
заголовок.
"Профиль" - это одна из частных конечных точек, и она настроена следующим образом:
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;
}
Теперь все работает, кроме требования нет. 3: если модуль аутентификации устанавливает Authorization
заголовок, клиент никогда не получает его.
Поток должен быть таким:
- Клиент делает запрос
auth-module
перехватывает запрос и, если он действителен, прокси передает его частной службе- Когда ответ отправляется, заголовки устанавливаются
auth-module
должны быть сохранены и отправлены клиенту
Я думаю, что я не понял, как правильно комбинировать auth_request_set
, proxy_set_header
, auth_request_set
также может быть, что они не подходят для этого сценария.
Есть ли способ сделать это в NGINX?
2 ответа
Хорошо, я смог сделать это с помощью 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;
}
Вот как мне удалось решить эту проблему без специального модуля:
location /auth {
internal;
proxy_pass http://localhost:3000/auth;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Original-Remote-Addr $remote_addr;
proxy_set_header X-Original-Host $host;
}
location /protected {
auth_request /auth;
auth_request_set $authentication_id $sent_http_x_authentication_id;
proxy_pass http://localhost:3000/protected;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Original-Remote-Addr $remote_addr;
proxy_set_header X-Original-Host $host;
proxy_set_header X-Authentication-Id: $authentication_id;
}
- Иметь свой
/auth
конечная точка включает заголовок ответа. Мои наборыX-Authentication-Id
- Использовать
auth_request_set
установить переменную на основе заголовка ответа - Используйте переменную, чтобы установить заголовок как часть
/protected
запрос