如何为基本身份验证发送正确的授权标头

ind*_*uo7 92 api django ajax jquery cross-domain

我正在尝试从我的API发布数据,但我无法通过基本身份验证.

我尝试:

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic ZWx1c3VhcmlvOnlsYWNsYXZl');
  }
});
Run Code Online (Sandbox Code Playgroud)

我的服务器配置响应是:

response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "*"
Run Code Online (Sandbox Code Playgroud)

我得到的标题是:

请求标题

OPTIONS /api/v1/token-auth/ HTTP/1.1
Host: theappurl.com
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
Access-Control-Request-Headers: origin, authorization, content-type
Accept: */*
Referer: http://127.0.0.1:8080/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: es,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Run Code Online (Sandbox Code Playgroud)

响应头

HTTP/1.1 401 Unauthorized
Server: nginx/1.1.19
Date: Fri, 16 Aug 2013 01:29:21 GMT
Content-Type: text/html
Content-Length: 597
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted"
Run Code Online (Sandbox Code Playgroud)

我想服务器配置很好,因为我可以从高级REST客户端(Chrome扩展)访问API

有什么建议?

PD:我从Advanced REST客户端获得的标题是:

    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
    Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
    Authorization: Basic ZWx1c3VhcmlvOnlsYWNsYXZl
    Content-Type: application/x-www-form-urlencoded 
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: es,en;q=0.8
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Run Code Online (Sandbox Code Playgroud)

    Server: nginx/1.1.19 
    Date: Fri, 16 Aug 2013 01:07:18 GMT 
    Content-Type: application/json; charset=utf-8 
    Transfer-Encoding: chunked 
    Connection: keep-alive
    Vary: Accept, Cookie 
    Allow: POST, OPTIONS 
    X-Robots-Tag: noindex
Run Code Online (Sandbox Code Playgroud)

发送OPTION方法

sea*_*p2k 66

根据https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decodinghttp://en.wikipedia.org/wiki/Basic_access_authentication,以下是如何使用标头代替Basic auth将用户名和密码放在URL中.请注意,这仍然不会隐藏任何有权访问网络或此JS代码的用户名或密码(例如,用户在浏览器中执行它):

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic ' + btoa(unescape(encodeURIComponent(YOUR_USERNAME + ':' + YOUR_PASSWORD))))
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 注意:此功能在 IE6、7、8、9 中需要使用 window.btoa polyfill,例如 Base64.js。此外,根据 ECMAScript v3,不推荐使用 unescape。 (2认同)

小智 45

您可以将用户和密码包含在URL中:

http://user:passwd@www.server.com/index.html
Run Code Online (Sandbox Code Playgroud)

请参阅此URL,了解更多信息

HTTP基本身份验证凭据在URL和加密中传递

当然,你需要用户名密码,但事实并非如此'Basic hashstring.

希望这可以帮助...

  • 此方法将用户名和密码公开给在网络或设备上收听的任何人... (53认同)
  • 这根本不回答这个问题.将其作为网址传递不是标题. (35认同)
  • 该解决方案不适用于Android的Native Browser(Pre KitKat).用户名/登录表单仍将为您的用户弹出,因此请小心. (6认同)
  • @Adam哈希字符串也不安全 (5认同)
  • 主流浏览器不再支持此功能,不推荐使用 (4认同)
  • 此方法在浏览器历史记录中公开用户名/密码,因为它是URL的一部分.此外,由于请求记录包括查询字符串,因此很可能会在服务器上登录.最好将user/pass作为"Authorization"标题的一部分包含在内.搜索http基本身份验证. (3认同)
  • downvote reason:https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication.在文章的最后,它提到"不推荐使用这些URL" (3认同)
  • @Brad因为问题具体说明发送了正确的标题,所以不要求浏览器魔术.另外,将其作为标题发送会消除在用户历史记录中看到的网址.以易于搜索的格式获取凭据并不是一件好事. (2认同)
  • 根据RFC3986 https://tools.ietf.org/html/rfc3986,不建议在userinfo字段中使用格式“ user:password”。 (2认同)

jak*_*b.g 35

NodeJS回答:

如果您想使用NodeJS执行此操作:使用Authorization标头创建GET到JSON端点并获取Promise后退:

第一

npm install --save request request-promise
Run Code Online (Sandbox Code Playgroud)

(请参阅npm)然后在您的.js文件中:

var requestPromise = require('request-promise');

var user = 'user';
var password = 'password';

var base64encodedData = new Buffer(user + ':' + password).toString('base64');

requestPromise.get({
  uri: 'https://example.org/whatever',
  headers: {
    'Authorization': 'Basic ' + base64encodedData
  },
  json: true
})
.then(function ok(jsonData) {
  console.dir(jsonData);
})
.catch(function fail(error) {
  // handle error
});
Run Code Online (Sandbox Code Playgroud)


fer*_*hur 10

如果您在浏览器环境中,也可以使用btoa

btoa是一个将字符串作为参数并生成Base64编码的ASCII字符串的函数。97%的浏览器都支持它。

例:

> "Basic " + btoa("billy"+":"+"secretpassword")
< "Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ="
Run Code Online (Sandbox Code Playgroud)

然后,您可以添加Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=authorization标题。

请注意,通常会使用有关HTTP BASIC身份验证的警告,最重要的是,如果您不通过HTTP发送流量,则窃听者可以简单地解码Base64编码的字符串,从而获得密码。

这个security.stackexchange.com答案很好地概述了一些缺点。