首先,我不是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
..
答案 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;
}
}