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

时间:2018-12-21 18:51:23

标签: nginx nginx-reverse-proxy

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

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

HTTP请求的Authentication标头中将包含OAuth2承载令牌。

例如授权:Bearer eyJhbGciOiJSUzI1NiIsImtpZ .... H5w

我有一个带有API的OAuth2服务器(UAA),在这里我可以调用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
..

1 个答案:

答案 0 :(得分:0)

您的map指令不起作用,名为组token的方式以某种方式干扰了$token变量,以下任何定义都将起作用:

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

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;
    }
}