Я пробовал получать данные POST из моего API, но я не могу передать базовую аутентификацию...
Я пытаюсь:
$.ajax({
type: 'POST',
url: http://theappurl.com/api/v1/method/,
data: {},
crossDomain: true,
beforeSend: function(xhr) {
xhr.setRequestHeader('Authorization', 'Basic ZWx1c3VhcmlvOnlsYWNsYXZl');
}
});
Ответ моей конфигурации сервера:
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"
Я предполагаю, что конфигурация сервера хороша, потому что я могу получить доступ к API из Advanced REST Client (расширение Chrome)
Любые предложения?
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:[email protected]/index.html
см. этот URL, для более
Учетные данные базовой аутентификации HTTP, переданные по URL-адресу и шифрованию
конечно, вам понадобится пароль пользователя, это не 'Basic hashstring
.
надеюсь, что это поможет...
Per https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding и http://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 ' + window.btoa(unescape(encodeURIComponent(YOUR_USERNAME + ':' + YOUR_PASSWORD))))
}
});
Если вы хотите сделать это с помощью NodeJS: сделайте GET для конечной точки JSON с заголовком Authorization
и получите 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
- это функция, которая принимает строку как аргумент и создает строку ASCII с кодировкой Base64. Его поддерживает 97% браузеров.
Пример:
> "Basic " + btoa("billy"+":"+"secretpassword")
< "Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ="
Затем вы можете добавить Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=
в заголовок authorization
.
Обратите внимание, что обычные оговорки об использовании протокола HTTP BASIC применяются, что самое главное, если вы не отправляете свой трафик через https, подслушиваемый может просто декодировать кодировку Base64, получая ваш пароль.
Этот ответ 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();