为啥 Chrome 有时会要求第二次进行基本身份验证,而 Firefox 则不会?
Posted
技术标签:
【中文标题】为啥 Chrome 有时会要求第二次进行基本身份验证,而 Firefox 则不会?【英文标题】:Why does Chrome sometimes ask for basic auth a second time and Firefox not?为什么 Chrome 有时会要求第二次进行基本身份验证,而 Firefox 则不会? 【发布时间】:2016-12-22 15:42:48 【问题描述】:我在 nginx 服务器(宅基地 Vagrant 盒子)上运行一个 React 前端和一个 Laravel 后端,在一个基本身份验证之后,Nginx 配置如下所示:
server
...
location /
try_files $uri $uri/ /index.php?$query_string;
auth_basic "Restricted";
auth_basic_user_file /home/vagrant/Code/project/.htpasswd;
这基本上可以正常运行,Chrome(v52,Mac OS X)“有时”会在后续请求中再次请求身份验证,例如在按钮悬停时加载定义为 css-background 的图像。这种行为(至少对于我迄今为止的研究而言)并不一致,我无法定期重现它,它不时发生,我找不到后续身份验证请求的原因。
在 Firefox(v47.0,Max OS X)中,我收到一个身份验证提示,然后它按预期工作。
您知道如何调试 Chrome 中的特定行为或确保只有第一个身份验证提示吗?
注意:前端向后端发送一些进一步的 XHR 调用,这些调用还设置了“授权”标头以完成基本身份验证而不显示提示。
【问题讨论】:
您是否尝试过检查 Chrome DevTools 中的请求以查看 Nginx 是否返回 401?如果确实返回 401 响应,Chrome 是否在该请求中发送了 Authorization 标头? 还可以查看this answer 中的故障排除步骤。 您能否确认裸 chrome 存在同样的问题,但未安装扩展程序? 【参考方案1】:我怀疑这里的问题在于您如何在本地存储授权令牌以及它的有效时间。浏览器处理本地存储的方式会有所不同,因此如果您使用的是本地存储或会话存储,则可能只是数据的持久化方式有所不同。
我相信这篇 SO 帖子可能有助于回答这个问题:How persistent is localStorage?
基本上,Chrome 允许数据设置超时期限,而在 Firefox 中“无法为您的任何数据指定过期期限”。
如果您经常使用 Chrome 并出于其他原因清除缓存,则您可能还会清除您的身份验证令牌。如果您仅使用 Firefox 进行测试,您可能有一个未过期的缓存身份验证令牌。
【讨论】:
基本认证的用户名和密码是存储在浏览器本地还是会话存储中? This 回答说明它存储在浏览器缓存中以上是关于为啥 Chrome 有时会要求第二次进行基本身份验证,而 Firefox 则不会?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Chrome 和 Firefox 使用基本身份验证的 CORS ajax 调用的行为不同?