如何为基本authentication发送正确的授权标头

我试图从我的API获取POST数据,但我不能通过基本身份validation…

我尝试:

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

我的服务器configuration响应是:

 response["Access-Control-Allow-Origin"] = "*" response["Access-Control-Allow-Methods"] = "POST" response["Access-Control-Max-Age"] = "1000" response["Access-Control-Allow-Headers"] = "*" 

我得到的标题是:

请求头

 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 

响应标题

 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" 

我猜服务器configuration是好的,因为我可以从高级REST客户端访问API(Chrome扩展)

有什么build议么?

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 

  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 

发送OPTION方法

您可以包含用户名和密码作为url的一部分:

 http://user:passwd@www.server.com/index.html 

看到这个URL,更多

HTTP基本身份validation凭据通过URL和encryption

当然,你需要用户名密码,它不是'Basic hashstring

希望这可以帮助…

根据https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding和http://en.wikipedia.org/wiki/Basic_access_authentication ,以下是如何使用标题进行基本身份validation把用户名和密码放在URL中 请注意,这仍然不会隐藏任何有权访问networking或此JS代码(例如,用户在浏览器中执行它)的用户的用户名或密码:

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

NodeJS回答:

如果你想用NodeJS来做:使用Authorization头做一个GET到JSON端点,然后得到一个Promise

第一

 npm install --save request request-promise 

( 请参阅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 }); 

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

btoa是一个函数,它将一个string作为参数,并生成一个Base64编码的ASCIIstring。 它支持97%的浏览器 。

例:

 > "Basic " + btoa("billy"+":"+"secretpassword") < "Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=" 

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

请注意,有关HTTP BASIC身份validation通常的警告适用,最重要的是,如果您不通过https发送您的stream量窃听可以简单地解码Base64编码的string,从而获得您的密码。

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

不需要使用用户名和密码作为URL的一部分

你可以试试这个

 byte[] encodedBytes = Base64.encodeBase64("user:passwd".getBytes()); String USER_PASS = new String(encodedBytes); HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();