Как отправить правильный заголовок авторизации для обычной проверки подлинности
Я попытался получить данные 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 из дополнительно отдыхать Клиент (Расширение Chrome)
какие предложения?
PD: Заголовок, который я получаю от Advanced rest client:
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
метод опции отправки
5 ответов:
Вы можете включить пользователя и пароль в URL:
http://user:passwd@www.server.com/index.html
смотрите этот URL, для получения дополнительной
учетные данные http Basic Authentication, переданные в 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 ' + btoa(unescape(encodeURIComponent(YOUR_USERNAME + ':' + YOUR_PASSWORD)))) } });
NodeJS ответ:
в случае, если вы хотите сделать это с NodeJS: сделать добраться до конечной точки JSON с
Authorization
заголовок и получиPromise
обратно:первый
npm install --save request request-promise
( смотрите на npm), а затем в
.js
file: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
- это функция, которая принимает строку в качестве аргумента и создает строку ASCII в кодировке Base64. Его поддерживает 97% браузеров.пример:
> "Basic " + btoa("billy"+":"+"secretpassword") < "Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ="
затем вы можете добавить
Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=
до
нет необходимости использовать пользователя и пароль в качестве части URL
вы можете попробовать это
byte[] encodedBytes = Base64.encodeBase64("user:passwd".getBytes()); String USER_PASS = new String(encodedBytes); HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();