`user:pass @ example.com`中的用户名不在$ _SERVER中

时间:2014-05-23 23:14:33

标签: php apache basic-authentication http-basic-authentication

首先,我的服务器没有在CGI模式下运行PHP。即使它是我有正确的mod_rewrite东西设置(这是一个Drupal网站)。

我的问题是,当用{/ 1}}形式通过网址传递用户/传递时,它们不会显示在任何http://user:pass@example.com的值中。不是$_SERVER,不是PHP_AUTH_USER,不是HTTP_AUTHORIZATION,或者是超级全球范围内的任何其他地方。

如果凭据通过浏览器的HTTP基本身份验证对话框传递,或者直接使用base64编码的REMOTE_USER HTTP标头,那么一切都按预期工作,`$ _SERVER [' HTTP_AUTH_USER'填写完毕,一切都很好。但是如果用户/传递是通过URL传递的,那么它就不行了。

关于可能会发生什么的任何想法?

  

PHP 5.3.10
  Apache 2.2.22

2 个答案:

答案 0 :(得分:1)

tl; dr: 401 Unauthorized响应的缓存使我误以为认证代码存在问题,而不是,它只是发送缓存的身份验证尽管有正确的凭据,但一遍又一遍地失败。禁用缓存可以解决问题。


对于上下文,这完全是针对API的。基本上,Drupal积极缓存来自API的响应,包括401 Unauthorized响应。但是我没有注意到授权失败的原因是由于缓存,我看到了两个不同的问题:响应被不正确地缓存,授权在某些情况下不起作用。

那是在生产,所以在我的开发环境中,我禁用了API的缓存,然后开始解决授权问题,没有意识到我已经解决了它。作为一种调试方法,我将响应短路,以便API不会实际检查HTTP Basic Auth凭证,它只会调出调试信息($_SERVER,主要是)。由于服务器不再发送401 Unauthorized,因此Safari不会打包用户并将URL作为HTTP授权标头传递。但我还没有意识到这一点。

因此,Safari在使用Apache处理HTTP Basic Auth的网站上的URL中使用user / pass,但它并没有使用我的PHP API。这让我觉得Apache正在使用URL中的身份验证,而不是发送它。这个想法产生了这个问题。

感谢BasicBarmar对该问题的评论,我意识到我的错误并经过测试实际发送了401 Unauthorized状态代码并且并且,Safari正在使用URL中的用户/传递。

我在开发API时没有注意到缓存,因为我登录了构建API的Drupal站点,而Drupal只对匿名用户进行了整页缓存。有趣的是,即使是Chrome应用Postman,它就像一个单独的应用程序,也会从主Chrome应用程序发送您的Cookie。我没有意识到当我用它发送请求时我登录了网站。

答案 1 :(得分:0)

http://httpd.apache.org/docs/2.2/howto/auth.html

您是否需要有效用户?在这样的街区。

AuthType Basic
AuthName "By Invitation Only"
# Optional line:
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
AuthGroupFile /usr/local/apache/passwd/groups
Require group GroupName

你能发布相关的httpd.conf块吗?