Передавая заголовки из auth_request

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

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

  1. если он недействителен, он возвращает 401
  2. если он действителен, он возвращает 200
  3. если он действителен, но истекает через 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;
}
  1. Иметь свой/authконечная точка включает заголовок ответа. Мои наборыX-Authentication-Id
  2. Использоватьauth_request_setустановить переменную на основе заголовка ответа
  3. Используйте переменную, чтобы установить заголовок как часть/protectedзапрос
Другие вопросы по тегам