如何在浏览器中发送授权头信息

25

我实现了一个使用Spring Security的基本身份验证的Web服务器。

当访问URL时,我禁用了默认的身份验证入口(而不是响应401和www-authentication头,它只返回401),目的是防止浏览器显示身份验证弹窗。

我能够使用JavaScript代码和类似curl的命令行工具连接到服务器,但是当我使用浏览器(Chrome和Firefox)测试时,它们就不会发送头文件。

curl -v -u user:password localhost:8080/user

GET /user HTTP/1.1
Host: localhost:8080
Authorization: Basic dXNlcjpwYXNzd29yZA==
User-Agent: curl/7.58.0
Accept: /

Chrome:版本71.0.3578.98(官方版本)(64位)
http://user:password@localhost:8080/user

GET /user HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
DNT: 1
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Accept-Encoding: gzip, deflate, br

接受语言: en-AU,en;q = 0.9,fr-FR;q = 0.8,fr;q = 0.7,en-GB;q = 0.6,en-US;q = 0.5

为什么浏览器没有发送身份验证标头。

4个回答

10

我发现了你的问题,因为我也在寻找同样的东西!

然而,我安装了https://modheader.com/并且它完美地工作了!!

您可以按照安装过程添加您想要的任何标头:

输入图像描述输入图像描述


@blimpse 你可以详细说明一下吗?这似乎解决了问题(实际上,它解决了我目前遇到的问题,这也是我发现这个问题的原因)。 - scubbo
4
尽管如此,对于这个特定的扩展的评论表明它相当靠不住(提到了向购物网站发送虚假流量和广告欺诈),所以也许这个特定的扩展不是一个好的解决方案 - 但我不明白为什么一个假设的扩展不能成为一个好的解决方案。 - scubbo

5

2

不幸的是,如果您希望浏览器在执行简单导航(而非XHR请求)时自动发送身份验证信息,并且不显示身份验证弹出窗口,则需要使用Cookie,其中包括CORS等所有相关问题。除了插件之外,没有其他标准方法可以将标头注入浏览器发出的每个GET请求。


不建议使用GET方法进行简单导航吗?我想要获取一个网页,并且希望URL也随之改变。如果我使用fetch或XHR,URL并不会改变...此外,我被告知不要使用document.write()动态更改文档内容。 - A B
1
@ab 抱歉,我不太确定你的意思。如果你在使用单页应用(SPA),通常大多数情况下你会希望使用 XHR 来处理大部分事务(包括 GET 请求),除非是图片或媒体链接之类的情况。在导航过程中,URL 会以编程方式进行更改,但这只是对用户的一种假象;从技术上讲,浏览器仍然停留在同一页上。因此,无论你是在进行"简单导航"还是使用 XHR,是否使用 cookie 身份验证都取决于你的应用程序。但在这两种情况下,cookie 身份验证都是常见的方法,因为这样你就不必为 XHR 手动注入任何内容(而在简单导航中也无法注入)。 - Emperor Eto
我的意思是,如果我在主页/home上,并且我想要获取联系我们页面,我希望URL也会改变为/contactUs。但是在XHR/fetch中,我们只能获取联系我们页面的HTML,并且必须手动重写文档。URL保持不变(/home)。 - A B
我的意思是,如果我在首页/home上,而我想要获取联系我们页面,我希望URL也会改变为/contactUs。但是在XHR/fetch中,我们只能获取联系我们页面的HTML,并且必须手动重写文档。URL保持不变(/home)。 - undefined
1
@AB 这可能有点偏离话题,也值得提出一个单独的问题,但是像React和Angular这样的SPA框架具备在浏览器地址栏中更改用户所看到的路由功能,而不实际更改页面。因此,它们会动态地改变文档内容,然后更改感知的路由。如果您重新加载或复制+粘贴链接,相同的模块将重新组织页面以匹配路由中的内容。但这一切都是通过XHR + DOM操作完成的;对于SPA来说,通常只有一个真正的index.html文件,至于浏览器来说,就是这么回事。 - Emperor Eto

1
实际上,您可以通过客户端JavaScript发送请求。使用AJAX请求,并在xhr请求参数中传递身份验证令牌。
<script type='text/javascript'>
// define vars
var url = 'https://...';

// ajax call
$.ajax({
    url: url,
    dataType : 'jsonp',
    beforeSend : function(xhr) {
      // set header if JWT is set
      if ($window.sessionStorage.token) {
          xhr.setRequestHeader("Authorization", "Bearer " +  $window.sessionStorage.token);
      }

    },
    error : function() {
      // error handler
    },
    success: function(data) {
        // success handler //can redirect to any route of your wish
    }
});
</script>

附言 - 我从在基于浏览器的应用程序中保存JWT的位置以及如何使用它得到了提示。


2
无法通过AJAX导航页面。我相信问题是如何从浏览器向HTML请求添加标题。 - grantwparks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接