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

我试图从我的 API 发布数据,但我不能通过基本的身份验证。

我试着:

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

我的服务器配置响应是:

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"

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

有什么建议吗?

我从 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 [REDACTED]
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 方法

568278 次浏览

您可以将用户名和密码作为 URL 的一部分:

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

查看这个 URL,了解更多

通过 URL 和加密传递的 HTTP 基本身份验证凭据

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

希望这能帮上忙。

根据 https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decodinghttp://en.wikipedia.org/wiki/Basic_access_authentication,下面介绍了如何使用头部进行基本身份验证,而不是将用户名和密码放在 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))))
}
});

无需使用用户和密码作为 URL 的一部分

你可以试试这个

byte[] encodedBytes = Base64.encodeBase64("user:passwd".getBytes());


String USER_PASS = new String(encodedBytes);


HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();

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 = Buffer.from(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是一个以字符串作为参数并生成 Base64编码的 ASCII 字符串的函数。它由 97% 的浏览器支持。

例如:

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

然后可以将 Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=添加到 authorization标头。

注意,关于 HTTP BASIC 认证的常见警告适用,最重要的是,如果您不通过 https 发送您的流量,窃听可以简单地解码 Base64编码的字符串,从而获得您的密码。

这个 security.stackexchange.com 的回答很好地概括了一些不利因素。

PHP-curl :

$username = 'myusername';
$password = 'mypassword';
...
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
...

PHP-POST in WordPress :

$username = 'myusername';
$password = 'mypassword';
...
wp_remote_post('https://...some...api...endpoint...', array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode("$username:$password")
)
));
...