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

100

Я пытаюсь отправить данные POST из своего 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"

Думаю, конфигурация сервера хороша, потому что я могу получить доступ к API из расширенного клиента REST (расширение Chrome)

Какие-либо предложения?

PD: Заголовок, который я получаю от расширенного клиента 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

индивидуальный7
источник
19
Я понимаю, что этот пост давно мертв, но я просто хочу указать на тот случай, если вы не знаете, что, разместив свой заголовок Authorization:, вы, по сути, опубликовали свой пароль в открытом виде. Строка тарабарщины - это просто кодировка base64 вашего имени пользователя: пароль, так что каждый может видеть ваш пароль. Надеюсь, вы поняли это и использовали здесь фиктивный пароль :)
Lexelby
Это отлично работает с сервером отчетов ssrs 2017. Он скрывает пароль и имя пользователя в URL-адресе.
Кларк Вера
@Lexelby: имя пользователя - «пользователь», а пароль - «и пароль» на испанском языке. Так что я предполагаю, что это ненастоящие полномочия.
pdr

Ответы:

49

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

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

см. этот URL, чтобы узнать больше

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

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

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

Dru
источник
6
Это решение не будет работать для собственного браузера Android (Pre KitKat). Форма имени пользователя / входа по-прежнему будет отображаться для вашего пользователя, поэтому будьте осторожны.
Стерлинг Борн,
58
Этот метод предоставляет имя пользователя и пароль всем, кто слушает в сети или на устройствах ...
Адам
5
Хеш-строка @Adam также небезопасна
Мустафа
38
Это вообще не отвечает на вопрос. Передача его как URL-адреса не является заголовком.
jemiloii
5
Причина отрицательного голосования: developer.mozilla.org/en-US/docs/Web/HTTP/Authentication . Ближе к концу статьи упоминается, чтоThe use of these URLs is deprecated
anurupr
70

Согласно https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding и http://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))))
  }
});
seanp2k
источник
1
Примечание. Для работы этой функции в IE6,7,8,9 потребуется полифилл window.btoa, например Base64.js. Также unescape устарел согласно ECMAScript v3.
null
@Techbrunch, вы ошибаетесь, пример seanp2k работает очень хорошо, он использует очень известный трюк для декодирования символов Unicode в ASCII, он фактически использует тот факт, что (un) escape не поддерживает Unicode, но (dec) encodeURIComponent поддерживает ..
41

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 = 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
});
jakub.g
источник
1
Спасибо, вы спасли мне день :)
Sparw
Спасибо, это сработало в моем приложении для реагирования, которое использовало "выборку"
MohsenFM
13

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

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

Пример:

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

Потом можно добавить Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=в authorizationшапку.

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

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

Fernandohur
источник
3

нет необходимости использовать имя пользователя и пароль как часть URL

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

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

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();
Erhanck
источник