我已经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,deny
etc.)和新的<RequireAny>
etc. 指令。旧指令仅用于向后兼容。混合使用这两种类型的指令可能会导致意外冲突。