首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从auth_request传递标头

从auth_request传递标头
EN

Server Fault用户
提问于 2019-01-20 15:03:55
回答 2查看 16K关注 0票数 14

我有一个授权模块,每当向私有端点发出请求时,都会调用该模块。

该模块从Authorization头解析令牌,并:

  1. 如果无效,则返回401
  2. 如果它有效,则返回200
  3. 如果它是有效的,但即将在X分钟内过期,它将生成一个新的令牌,并在Authorization头中返回那个令牌。

"profile“是私有端点之一,其配置方式如下:

代码语言:javascript
运行
复制
location /profile {
  auth_request /jwtverify;

  auth_request_set  $authorization $upstream_http_authorization;
  proxy_set_header  authorization $authorization;
  proxy_pass        http://private-profile:80;
}

jwtverify是这样配置的:

代码语言:javascript
运行
复制
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_setproxy_set_headerauth_request_set组合在一起,这也可能是因为它们不适合这种情况。

有没有办法在NGINX中实现这一点?

EN

回答 2

Server Fault用户

回答已采纳

发布于 2019-01-21 07:55:25

好的,我能够在headers_more模块的帮助下做到这一点。

完整的配置是:

代码语言:javascript
运行
复制
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;
}
票数 10
EN

Server Fault用户

发布于 2021-08-19 21:33:12

这就是我如何在没有自定义模块的情况下解决这个问题的方法:

代码语言:javascript
运行
复制
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;
}
  1. 让您的/auth端点包含一个响应头。水雷集X-Authentication-Id
  2. 使用auth_request_set根据响应头设置变量
  3. 使用变量将标头设置为/protected请求的一部分
票数 8
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/949951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档