HTTP Basic Auth提交的凭据实际是通过什么流程完成身份验证的?
问题1:HTTP Basic Authentication 凭据验证逻辑
HTTP Basic Authentication 标准本身仅定义了凭据的编码和传输规则,验证逻辑完全由服务端自主实现,没有统一要求,常见的验证链路分为两种:
- 服务器层直接验证:如果你用Apache/Nginx原生的Basic Auth功能,服务器会先把
Authorization请求头里Basic后面的Base64字符串解码,得到用户名:密码格式的明文,再和你提前配置的密码文件(比如Apache的.htpasswd、Nginx的auth_basic_user_file指定的文件)里的哈希值做比对,比对通过就直接返回资源,不匹配就返回401。 - 应用层验证:如果你是自己写后端逻辑处理认证,服务器会把解码后的账号密码或者原始
Authorization头传给后端程序(比如PHP),你可以自己把拿到的凭据和数据库里存储的用户账号密码、预设的配置项、内部用户中心的数据做比对,校验通过再返回对应内容,校验失败返回401即可。
问题2:环境变量传递失败的原因和检查项
你遇到的mod_rewrite设置环境变量不生效的问题,常见原因和PHP配置检查点如下:
首先确认依赖模块开启
首先要确认你的Apache已经开启mod_env和mod_setenvif两个模块,你用的SetEnvIf、RewriteRule设置环境变量的规则都依赖这两个模块,未开启的话规则不会生效。
PHP配置检查项
- 先看phpinfo里的
variables_order配置项,它的取值必须包含字符E(代表加载Environment环境变量),比如常见的EGPCS,如果没有E,$_SERVER、$_ENV全局变量不会读取环境变量的值。 - 如果你的PHP是FPM模式运行,优先检查php-fpm pool配置里的
clear_env参数,默认值为On,会清空所有从Web服务器传递过来的环境变量,只保留FPM配置内白名单的变量。解决方法要么是设置clear_env = Off,要么在pool配置中手动添加env[HTTP_AUTHORIZATION] = $HTTP_AUTHORIZATION允许该变量透传。 - 检查
cgi.rfc2616_headers配置项是否为On,开启后PHP才会正确识别HTTP规范的自定义请求头。
额外的Web服务器配置检查
如果用的是Apache的mod_fcgid模块,还要检查fcgid配置中是否添加了FcgidPassHeader Authorization规则,默认mod_fcgid会过滤掉Authorization头避免敏感信息泄露,需要显式配置允许传递。
内容的提问来源于stack exchange,提问作者Rounin
相关产品推荐
相关产品推荐

