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

57

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

  • 15
    Я понимаю, что это сообщение давно умерло, но я просто хочу указать на тот случай, если вы не знаете, что, разместив свой заголовок Authorization :, вы по сути отправили свой пароль в открытом виде. В строке gibberish есть только кодировка base64 вашего имени пользователя: пароль, так что каждый может увидеть ваш пароль. Надеюсь, вы поняли это и использовали здесь фиктивный пароль :)
Теги:
cross-domain

5 ответов

37
Лучший ответ

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

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

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

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

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

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

  • 0
    пожалуйста, вы можете отредактировать свой ответ и изменить URL, чтобы предотвратить индексацию Google или ботов
  • 4
    Это решение не будет работать для родного браузера Android (Pre KitKat). Форма пользователя / логин все еще будет отображаться для вашего пользователя, поэтому будьте осторожны.
Показать ещё 16 комментариев
50

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))))
  }
});
  • 1
    Примечание. Для работы этой функции в IE6, 7, 9, 9 потребуется полифилл window.btoa, например Base64.js. Также unescape не рекомендуется в соответствии с ECMAScript v3.
  • 0
    @Techbrunch вы ошибаетесь, пример seanp2k работает очень хорошо, он использует очень известный прием для декодирования символов Unicode в ASCII, он фактически использует тот факт, что (un) escape не поддерживает Unicode, но (dec) encodeURIComponent делает ..
12

Ответ 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
});
  • 0
    Спасибо, ты спас мой день :)
2

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

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

Пример:

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

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

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

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

1

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

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

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

String USER_PASS = new String(encodedBytes);

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню