Як надіслати правильний заголовок авторизації для базової автентифікації


100

Я намагаюся опублікувати дані з мого 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 від 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 [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


19
Я усвідомлюю, що ця публікація вже давно мертва, але я просто хочу зазначити, на випадок, якщо ви не знаєте, що розмістивши свій заголовок Authorization: ви, по суті, опублікували свій пароль у чистому полі. Рядок тупиць там - це лише кодування base64 вашого імені користувача: пароль, тому кожен може бачити ваш пароль. Сподіваємось, ви це зрозуміли і використали тут фіктивний пароль :)
Лексельбі

Це чудово працює з сервером звітів ssrs 2017. Він приховує пароль та ім’я користувача в URL-адресі.
Clark Vera

@Lexelby: Ім'я користувача - "користувач", а пароль - "та пароль" іспанською мовою. Тож я здогадуюсь, що це не справжні дані.
pdr

Відповіді:


48

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

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

див. цю URL-адресу, щоб дізнатися більше

Повноважні дані автентифікації HTTP, передані в URL та шифруванні

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

сподіваюся, це допомагає ...


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
анурупр

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

1
Примітка. Щоб ця функція працювала в IE6,7,8,9, потрібен полізаповнювач window.btoa, такий як Base64.js. Також unescape не підтримується відповідно до ECMAScript v3.
нуль

@Techbrunch ви помиляєтесь, приклад seanp2k працює дуже добре, він використовує дуже відомий трюк для декодування символів Unicode до ASCII, насправді використовує той факт, що (не) втеча не підтримує Unicode, але (dec) encodeURIComponent це робить.

40

Відповідь NodeJS:

Якщо ви хочете зробити це за допомогою NodeJS: створіть кінцеву точку GET to 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
});

1
Дякую, ти врятував мій день :)
Sparw

Дякую, це спрацювало в моєму додатку для реагування, який використовував "
вибір

13

Якщо ви перебуваєте в середовищі браузера, ви також можете використовувати btoa .

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

Приклад:

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

Потім ви можете додати Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=до authorizationзаголовка.

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

Ця відповідь security.stackexchange.com дає хороший огляд деяких недоліків.


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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.