如何使用浏览器发送授权标头

Posted

技术标签:

【中文标题】如何使用浏览器发送授权标头【英文标题】:How to send Authorization header with browser 【发布时间】:2019-07-03 13:16:37 【问题描述】:

我已经实现了一个使用基本身份验证(使用 spring 安全性)的 Web 服务器。

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

我可以使用 javascript 代码和 curl 等命令行工具连接到服务器,但是当我使用浏览器(chrome 和 firefox)对其进行测试时,它们只是不发送标头。

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

GET /user HTTP/1.1 主机:本地主机:8080授权:基本 dXNlcjpwYXNzd29yZA== 用户代理:curl/7.58.0 接受:/

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

GET /user HTTP/1.1 主机:本地主机:8080 连接:保持活动 升级不安全请求:1 用户代理: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 接受: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8 接受编码: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

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

【问题讨论】:

【参考方案1】:

通常浏览器在登录后会获取 Auth-token。后端将有效令牌作为授权部分添加到标头。 要使用浏览器处理 HTML 请求,您需要像 https://addons.mozilla.org/de/firefox/addon/restclient/ 这样的插件或像 postman、SoapUI、httpie 或 curl 这样的额外工具(包括在许多 linux 发行版中)。

【讨论】:

【参考方案2】:

其实可以的。 在客户端 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>

附注- 我从 Where to save a JWT in a browser-based application and how to use it得到提示

【讨论】:

以上是关于如何使用浏览器发送授权标头的主要内容,如果未能解决你的问题,请参考以下文章

Nuxt appolo 模块如何发送授权标头?

JWT:如何在标头中发送授权?

如何使用授权标头发出 GET CORS 请求

如何设置授权标头(JWT)

http post - 如何发送授权标头?

如何在授权标头中将带有 fetch 和 cors 的 JWT 令牌发送到 Express 服务器?