使用 fetch 进行基本身份验证(或任何身份验证)

Posted

技术标签:

【中文标题】使用 fetch 进行基本身份验证(或任何身份验证)【英文标题】:Basic authentication (or any authentication) with fetch 【发布时间】:2016-07-01 01:57:10 【问题描述】:

找不到任何关于此的文档,所以在我深入研究代码之前,有没有人知道在使用 'fetch' (https://github.com/github/fetch) 发出 REST 请求时如何使用基本身份验证。

刚试了下面这行,但是请求中没有设置header:

  fetch('http://localhost:8080/timeEntry', 
      mode: 'no-cors',
      headers:  'Authorization': 'Basic YW5kcmVhczpzZWxlbndhbGw=' 
    )
    .then(checkStatus)
    .then(parseJSON)
    .then(function(activities) 
      console.log('request succeeded with JSON response', data);
      dispatch(activitiesFetched(activities, null));
    ).catch(function(error) 
      console.log('request failed', error);
      dispatch(activitiesFetched(null, error));
    );

用户名和密码是我自己的名字和姓氏,使用curl 可以。

如果我设置了 'Accept' : 'application/test' Accept,就不是Authorization...奇怪了。

为了让我能够继续,我添加了credentials: 'include',它使浏览器提示输入用于与 REST 后端通信的用户名和密码。仅用于测试,将进一步使用 OAuth。

  fetch('http://localhost:8080/timeEntry', 
      mode: 'no-cors',
      credentials: 'include'
    )
    .then(checkStatus)
    .then(parseJSON)
    .then(function(activities) 
      console.log('request succeeded with JSON response', data);
      dispatch(activitiesFetched(activities, null));
    ).catch(function(error) 
      console.log('request failed', error);
      dispatch(activitiesFetched(null, error));
    );

【问题讨论】:

“身份验证”到底是什么意思?你想做什么? 我正在使用 Spring Boot 来公开一个 REST api,它需要基本身份验证,因为我现在已经设置了它。基本上我想做一个“授权:基本 QWxhZGRpbjpPcGVuU2VzYW1l”......但在我自己发送标题之前,我只想检查该功能是否内置在 fetch api 中。 据我记忆,基本身份验证只是设置标题,所以它应该像在传递给函数的对象中添加一些一样简单。 【参考方案1】:

由于您使用的库看起来像是 Fetch API 的 polyfill,因此我将假设语法也应该执行。

我在 Mozilla 页面上找到的示例表明 fetch 方法签名是 fetch('API_ENDPOINT', OBJECT) 其中 object 看起来像:

myHeaders = new Headers(
  "Authorization": "Basic YW5kcmVhczpzZWxlbndhbGw="
);

var obj =   
  method: 'GET',
  headers: myHeaders
)

所以方法变成了:

fetch('http://localhost:8080/timeEntry', obj)
    .then(checkStatus)
    .then(parseJSON)...

我没有测试过这段代码,但它似乎与我能找到的一致。希望这能为您指明正确的方向。

【讨论】:

【参考方案2】:

请注意,如果您将fetchAuthorization 标头一起使用,您将不会建立会话。您必须为每个请求手动添加该标头。也无法导航到安全路径。

所以要完成这项工作,您应该使用XMLHttpRequest 进行预身份验证。你可以这样做:

                        var authUrl = location.origin + '/secured-path/';
                        var http = new XMLHttpRequest();                        
                        http.open("get", authUrl, false, login, pass);
                        http.send("");
                        if (http.status == 200) 
                            //location.href = authUrl;
                         else 
                            alert("⚠️ Authentication failed.");
                        

注意上面是同步的,所以这里不需要回调。

因此,在这样做之后,您可以使用不带标题的 fetch,例如这个请求应该是成功的:

                        fetch(authUrl,  
                            method: 'get',
                        ).then(function(response) 
                            console.log(response);
                        );

【讨论】:

知道为什么 Fetch API 没有类似的功能吗?【参考方案3】:

no-cors 模式可防止标题成为简单标题以外的任何内容。

“授权”标头不适合简单标头。在此处查看更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Request/mode

【讨论】:

以上是关于使用 fetch 进行基本身份验证(或任何身份验证)的主要内容,如果未能解决你的问题,请参考以下文章

通过 IIS 在 ASP Classic 中进行 HTTP 身份验证(基本或摘要)[关闭]

在 TFS2013 中使用 Git 进行 Kerberos 身份验证

使用当前 httpclient (4.x) 的 RestTemplate 基本或摘要身份验证

如何使用jQuery和Ajax对DreamFactory进行基本身份验证

使用 Fetch 的 WordPress REST API 身份验证

在 Spring Security 中接收令牌的基本身份验证