Назад | Перейти на главную страницу

передача заголовков из auth_request

У меня есть модуль авторизации, который вызывается всякий раз, когда делается запрос к частной конечной точке.

Модуль анализирует токен из Authorization заголовок и:

  1. если он недействителен, возвращает 401
  2. если он действителен, он возвращает 200
  3. если он действителен, но срок его действия истекает через X минут, он генерирует новый токен и возвращает его в 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_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;
}