我有一个授权模块,每当向私有端点发出请求时,都会调用该模块。
该模块从Authorization
头解析令牌,并:
Authorization
头中返回那个令牌。"profile“是私有端点之一,其配置方式如下:
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:如果auth模块设置了Authorization
头,客户端就不会收到它。
流动应该是这样的:
auth-module
拦截请求,如果有效,代理将其传递给私有服务。auth-module
设置的标头,并将其发送给客户端。我想我没有正确地理解如何将auth_request_set
、proxy_set_header
、auth_request_set
组合在一起,这也可能是因为它们不适合这种情况。
有没有办法在NGINX中实现这一点?
发布于 2019-01-21 07:55:25
好的,我能够在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;
}
发布于 2021-08-19 21:33:12
这就是我如何在没有自定义模块的情况下解决这个问题的方法:
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;
}
/auth
端点包含一个响应头。水雷集X-Authentication-Id
auth_request_set
根据响应头设置变量/protected
请求的一部分https://serverfault.com/questions/949951
复制相似问题