Apache2:通过匹配某些表达式从基本身份验证中排除所有其余 api Request_URI

Apache2:通过匹配某些表达式从基本身份验证中排除所有其余 api Request_URI

我已经Basic Auth为 Opencart 项目设置了浏览器身份验证,以仅允许相关用户访问。现在,I need to use REST API for a mobile app。当我从 API 调用端点以从 Opnecart 项目获取一些详细信息时,它需要从 API 生成一个 access_token,并且通过在每个请求中使用该 access_token,我可以从 API 获取详细信息。问题是我为项目设置了 Basic Auth,因此我无法访问 API,因为我只能使用 1 种方法来访问 API,即 GET 方法从 opencart 获取详细信息,我不能使用 2 种方法,即Auth Header and GET methods。所以,what I am trying to do is to disable Basic Auth if the Request_URI includes api calls.

到目前为止,我已经对项目的 vhost 进行了如下尝试,但都没有成功。

从以下问题的可接受答案中得到了这个想法,但对我来说却不起作用。 https://stackoverflow.com/questions/8978080/htaccess-exclude-one-url-from-basic-auth?answertab=votes#tab-top

<Directory /var/www/html/projectexample>
 AllowOverride All        
 # Auth stuff
 AuthName "Authentication Required"
 AuthType Basic
 AuthUserFile /etc/apache2/.htpasswd
 Order allow,deny
 Deny from all
 Satisfy any
 <RequireAny>
    <RequireAll>
        Require expr %{REQUEST_URI} =~ m#^/api/rest/.*#
    </RequireAll>
    Require valid-user
 </RequireAny>
</Directory>

我也尝试过使用如下所示的 SetEnvIf 环境变量但也没有成功。

<Directory /var/www/html/projectexample>
  AllowOverride All        
  # Auth stuff
  AuthName "Authentication Required"
  AuthType Basic
  AuthUserFile /etc/apache2/.htpasswd
  SetEnvIf Request_URI "^/api/*" allow=1
  #SetEnvIf Request_URI "^/(api/*)" allow=1
  Order allow,deny
  Require valid-user
  Allow from env=allow
  Deny from env!=allow
  Satisfy any
</Directory>

请问有什么解决办法吗?

答案1

由于我在项目中启用了 SEO URL,因此这个解决方案对我来说很有效:

<Directory /var/www/html/projectexample>
    AllowOverride All
</Directory>

<Location "/">
    # Default to Basic Auth protection for any stie
    AuthType Basic
    AuthName "Authentication required"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user

    # If the request goes to a rest page: bypass basic auth
    SetEnvIf Request_URI ^/api/ noauth=1

    # gets REDIRECT_ prepended if the request is a redirect
    Allow from env=REDIRECT_noauth
    Allow from env=noauth
    Order allow,deny
    Satisfy any
    Deny from env!=noauth
</Location>

Allow from env=REDIRECT_noauth正在对 SEO URL 施展魔法。

答案2

假设/var/www/html/projectexample是您的文档根目录,并且/var/www/html/projectexample/api是您想要允许不受限制访问的 API 目录,那么您只需创建两个<Directory>容器即可。例如:

<Directory /var/www/html/projectexample>
  AuthName "Authentication Required"
  AuthType Basic
  AuthUserFile /etc/apache2/.htpasswd
  Require valid-user
</Directory>

<Directory /var/www/html/projectexample/api>
  Require all granted
</Directory>

更具体的/api <Directory>容器将覆盖前者。

假设您使用的是 Apache 2.4+,则切勿混合使用旧的 Apache 2.2 auth 指令(Order allow,denyetc.)和新的<RequireAny>etc. 指令。旧指令仅用于向后兼容。混合使用这两种类型的指令可能会导致意外冲突。

相关内容