Как отправить правильный заголовок авторизации для базовой аутентификации

Я пробовал получать данные 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

Ответ 1

Вы можете включить пользователя и пароль как часть URL-адреса:

http://user:[email protected]/index.html

см. этот URL, для более

Учетные данные базовой аутентификации HTTP, переданные по URL-адресу и шифрованию

конечно, вам понадобится пароль пользователя, это не 'Basic hashstring.

надеюсь, что это поможет...

Ответ 2

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))))
  }
});

Ответ 3

Ответ NodeJS:

Если вы хотите сделать это с помощью 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
});

Ответ 4

Если вы находитесь в среде браузера, вы также можете использовать btoa.

btoa - это функция, которая принимает строку как аргумент и создает строку ASCII с кодировкой Base64. Его поддерживает 97% браузеров.

Пример:

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

Затем вы можете добавить Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ= в заголовок authorization.

Обратите внимание, что обычные оговорки об использовании протокола HTTP BASIC применяются, что самое главное, если вы не отправляете свой трафик через https, подслушиваемый может просто декодировать кодировку Base64, получая ваш пароль.

Этот ответ security.stackexchange.com дает хороший обзор некоторых недостатков.

Ответ 5

не нужно использовать пользователя и пароль как часть URL

вы можете попробовать это

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

String USER_PASS = new String(encodedBytes);

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