Nginx - 如何创建将与 auth_request 模块一起使用的自定义请求

Mik*_*ike 4 nginx nginx-reverse-proxy

首先:我不是 nginx 专家。非常新手。

我正在尝试使用 nginx 进行身份验证来保护第 3 方软件(实际上 - 只是验证请求是否具有有效的 OAuth2 Bearer 令牌)

HTTP 请求的身份验证标头中将包含 OAuth2 持有者令牌。

例如授权:承载 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;
 }
Run Code Online (Sandbox Code Playgroud)

对 nginx 保护的第三方服务器的预期请求:

<GET|POST|PUT|DELETE> /anyurl HTTP1/1.1
..
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZ....H5w
..
Run Code Online (Sandbox Code Playgroud)

预期请求转发到 UAA 服务器以验证令牌

GET /check_token?token=eyJhbGciOiJSUzI1NiIsImtpZ....H5w
..
Authorization Basic asfasdfdf
..
Run Code Online (Sandbox Code Playgroud)

Iva*_*sky 5

您的map指令不起作用,命名组token以某种方式干扰$token变量,这些定义中的任何一个都可以工作:

map $http_authorization $token {
    ~^Bearer\s+([\S]+)$ $1;
}
Run Code Online (Sandbox Code Playgroud)

或者

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

完整的工作配置将如下所示:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)