Nginx — как я могу создать собственный запрос, который будет использоваться с модулем auth_request

Для начала: я НЕ эксперт по nginx. Очень новичок в этом.

Я пытаюсь защитить стороннее программное обеспечение с помощью nginx, выполняющего аутентификацию (на самом деле - просто проверяя, что запрос имеет действительный токен носителя OAuth2)

HTTP-запрос будет иметь токен носителя OAuth2 в заголовке Authentication.

например Авторизация: предъявитель eyJhbGciOiJSUzI1NiIsImtpZ....H5w

У меня есть сервер OAuth2 (UAA) с API, с помощью которого я могу вызвать http://myuaa/check_token?token=eyJhbGciOiJSUzI1NiIsImtpZ....H5w, чтобы вернуть 2XX или 4XX, если токен действителен. Сложность заключается в том, что этому серверу требуется базовая аутентификация для вызова конечной точки /check_token.

Я попытался использовать карту для анализа токена из заголовка авторизации, но безуспешно.

Просто как-то в недоумении.

Возможно, это не подходит для Nginx?

соответствующие части nginx.conf

# this map isnt working as I thought it might
http {
    ...
    map $http_authorization $token {
        ~Bearer(?<token>abc)    $token;
 }

...

# test just to see if the authorization header is being parsed and passed - no luck
 location /oauth {
         proxy_set_header X-my-header $token;
         proxy_set_header X-another-header value;
         proxy_set_header Authorization "Basic basdasdfasdf";
         proxy_pass http://localhost:8080;
 }

Ожидаемый запрос к стороннему серверу, который защищает nginx:

<GET|POST|PUT|DELETE> /anyurl HTTP1/1.1
..
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZ....H5w
..

Ожидаемый запрос, перенаправленный на сервер UAA для проверки токена

GET /check_token?token=eyJhbGciOiJSUzI1NiIsImtpZ....H5w
..
Authorization Basic asfasdfdf
..

person Mike    schedule 21.12.2018    source источник


Ответы (1)


Ваша директива map не работает, именованная группа token каким-то образом мешает переменной $token, любое из этих определений будет работать:

map $http_authorization $token {
    ~^Bearer\s+([\S]+)$ $1;
}

or

map $http_authorization $token {
    ~^Bearer\s+(?<bearer>[\S]+)$ $bearer;
}

Полный рабочий конфиг будет выглядеть так:

map $http_authorization $token {
    ~^Bearer\s+(?<bearer>[\S]+)$ $bearer;
}

server {
    ...
    location / {
        auth_request            /uaa;
        ...
    }
    location /uaa {
        internal;
        proxy_pass_request_body off;
        proxy_set_header        Authorization "Basic your_base64_auth_string";
        proxy_set_header        Content-Length "";
        proxy_pass              http://localhost:8080/check_token?token=$token;
    }
}
person Ivan Shatsky    schedule 22.12.2018