首先,我的服务器没有在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
答案 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中的身份验证,而不是发送它。这个想法产生了这个问题。
感谢Basic和Barmar对该问题的评论,我意识到我的错误并经过测试实际发送了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块吗?