Nginx auth_request_set未按预期工作

2skhul33  于 2023-01-25  发布在  Nginx
关注(0)|答案(1)|浏览(192)
    • bounty将在6天后过期**。回答此问题可获得+200声望奖励。emmdee希望引起更多人对此问题的关注:我真的很难弄清楚如何/为什么这样的行为,我应该做什么来解决。应该是直接再现/故障排除与网站配置的例子,我提供了。感谢任何人的帮助。

我已经审查了这些类似的职位:

不过,我想我在这方面还是需要一些帮助的...
我遇到的问题是auth_request_set无法按预期工作。
下面是一个简化的"概念证明"配置,它是我所面临的问题的一个易于重现的示例。可以作为站点配置运行:

map $auth_resp_x_user $invalid_user {
  default "1";
  authUser "0";
}

server {
  listen 8080;

  auth_request /fake-auth;

  auth_request_set $auth_resp_x_user authUser;

  location = /fake-auth {
    # Mock a successful auth_request
    return 200;
  }

  location / {

    if ($invalid_user) {
      return 403;
    }

    return 200;

  }
}

我希望auth_request_setauth_request完成后触发。
但是,似乎没有为$auth_resp_x_user设置任何值,因此上面的位置/将返回403
如果我只将这一行更改为使用set而不是auth_request_set,它将正常工作。
这将返回位置/200,符合预期:

map $auth_resp_x_user $invalid_user {
  default "1";
  authUser "0";
}

server {
  listen 8080;

  auth_request /fake-auth;

  set $auth_resp_x_user authUser;

  location = /fake-auth {
    # Mock a successful auth_request
    return 200;
  }

  location / {

    if ($invalid_user) {
      return 403;
    }

    return 200;

  }
}

既然set工作正常,我知道我在auth_request_set上做错了什么。我只是不确定我到底做错了什么。谢谢你的帮助。

hyrbngr7

hyrbngr71#

您所面临的问题是auth_request_set仅用于设置auth_request发出的子请求的上下文中的变量,在您的示例中,auth_request_set语句不在location = /fake-auth block中,因此变量$auth_resp_x_user没有设置。
您可以通过将auth_request_set语句移到location = /fake-auth块中来解决此问题,如下所示:

map $auth_resp_x_user $invalid_user {
  default "1";
  authUser "0";
}

server {
  listen 8080;

  auth_request /fake-auth;

  location = /fake-auth {
    auth_request_set $auth_resp_x_user authUser;
    return 200;
  }

  location / {

    if ($invalid_user) {
      return 403;
    }

    return 200;

  }
}

这样,当发出对/fake-auth的子请求时,变量$auth_resp_x_user将被设置为“authUser”,然后可以在主请求中使用它。
或者,您可以在主请求中使用auth_request_set设置变量,在子请求完成后,然后使用它,如下所示:

map $auth_resp_x_user $invalid_user {
  default "1";
  authUser "0";
}

server {
  listen 8080;

  auth_request /fake-auth;
  
  auth_request_set $auth_resp_x_user authUser;

  location = /fake-auth {
    return 200;
  }

  location / {

    if ($invalid_user) {
      return 403;
    }

    return 200;

  }
}

一定要记住,auth_request_set应该在子请求完成后使用,否则,变量将不会被设置。

相关问题