Базові аутентифікація HTTP та токена носія


115

В даний час я розробляю REST-API, захищений HTTP-Basic для середовища розробки. Оскільки справжня автентифікація проводиться за допомогою маркера, я все ще намагаюся розібратися, як надіслати два заголовки авторизації.

Я спробував це:

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Authorization: Bearer mytoken123"

Я можу, наприклад, відключити HTTP-аутентифікацію для мого IP, але оскільки я зазвичай працюю в різних середовищах з динамічними IP-адресами, це не є гарним рішенням. То я щось пропускаю?


2
Мені потрібно автентифікуватись через HTTP Basic, оскільки сервер Dev захищений ним, і мені потрібна аутентифікація на основі лексеми для api. Але оскільки я використовую curl для тестування api, мені потрібен спосіб надіслати обидва заголовка аутентифікації. Отже, перший (базовий) для передачі HTTP Basic, а другий (маркер) для автентифікації для моєї програми. І так, це власне творіння.
Azngeek

1
Ви коли-небудь це з'ясовували? Я додаю щедроту
Адам Уайт

4
Привіт, Адам, на жаль, ні. Тепер я змінив спосіб роботи автентифікації, змінивши заголовок авторизації для маркера на "x-auth", що не є стандартним заголовком.
Azngeek

1
Мій сервер nginx навіть не прийме 2 заголовки авторизації. Він повертає a 400 Bad request. Нерозумно.
Rudie

1
Що не так у використанні користувацького заголовка для вашого маркера API? Я не бачу, чому люди тут "бракують" за допомогою HTTP Basic Auth, щоб утримувати свої сервери розробки / інсценізації подалі від сторонніх очей.
Суніл Д.

Відповіді:


68

Спробуйте скористатися цим, щоб натиснути основну автентифікацію за URL-адресою:

curl -i http://username:password@dev.myapp.com/api/users -H "Authorization: Bearer mytoken123"
               ^^^^^^^^^^^^^^^^^^

Якщо вище одного не працює, то ви нічого з цим не маєте. Тому спробуйте наступні замінники.

Ви можете передати маркер під іншим іменем. Тому що ви обробляєте авторизацію зі своєї Заявки. Таким чином, ви можете легко використовувати цю гнучкість для цієї спеціальної мети.

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Application-Authorization: mytoken123"

Зверніть увагу: я змінив заголовок на Application-Authorization. Тож із своєї програми виберіть маркер під цим заголовком і обробіть те, що вам потрібно зробити.

Ще одна річ , яку ви можете зробити, щоб пройти tokenчерез POSTпараметри і захопити значення параметра з боку сервера. Наприклад, передача токена з параметром "curl post":

-d "auth-token=mytoken123"

1
Вітаю, Sabuj, проблема полягає не в тому, як ви передасте ім'я користувача та пароль, але кілька заголовків авторизації просто не працюють. Переглядаючи характеристики ( ietf.org/rfc/rfc2617.txt ), я бачу, що це повинно бути можливим. Але, як також зазначено, "" Агент користувача ОБОВ'ЯЗКОВО вирішити використовувати один із викликів із найсильнішою схемою auth, яку він розуміє, і вимагати облікові дані від користувача на основі цього виклику. "Так, як я писав 2 дні тому, мені потрібно було пройти на нестандартний заголовок, що абсолютно нормально, коли ви маєте справу з нестандартними архітектурами.
Azngeek

5
@Azngeek Curl дійсно надсилає обидва заголовки авторизації під час виконання завдання. Вам потрібно обробити це з кінця вашого сервера. Просто запустіть команду curl з обома заголовками з -vпарам. Ви побачите, що його надсилання Authorization: Basic Ym9zY236Ym9zY28=, Authorization: Bearer mytoken123на заголовок запиту. Якщо ви встановите цей пункт, ви побачите, що у вас такий заголовок авторизації, як Authorization: Basic Ym9zY236Ym9zY28=, Bearer mytoken123розділений комою. Отже, я хоч і повинен запропонувати вам альтернативи.
Сабудж Хассан

34

Стандарт ( https://tools.ietf.org/html/rfc6750 ) говорить, що ви можете використовувати:

  • Параметр тіла, закодований формою: Авторизація: Mytoken123
  • Параметр запиту URI: access_token = mytoken123

Таким чином, можна передавати багато токенів Bearer з URI, але це не рекомендується (див. Розділ 5 стандарту).


4

Якщо ви використовуєте зворотний проксі, наприклад nginx між ними, ви можете визначити спеціальний маркер, наприклад X-API-Token .

У nginx ви б переписали його для того, щоб проксі-сервер вище (поточний api) був просто автентичним:

proxy_set_header Authorization $http_x_api_token;

... в той час як nginx може використовувати оригінальний заголовок авторизації для перевірки HTTP AUth.


3

У мене була подібна проблема - автентифікувати пристрій та користувача на пристрої. Я використовував Cookieзаголовок поряд із Authorization: Bearer...заголовком.


Незрозуміло, чому потік. Я натрапив на це питання, шукаючи відповідь на пов’язану проблему - ось як я її вирішив. CookieТема вже часто використовується для перевірки автентичності.
Ірідаїн

2

завиток --anyauth

Розповідає curl, щоб самостійно з'ясувати метод аутентифікації та використовувати найбільш захищений, який віддалений сайт вимагає підтримувати. Це робиться, попередньо зробивши запит і перевіривши заголовки відповідей, таким чином, можливо, індукуючи додатковий обхід мережі. Це використовується замість встановлення конкретного методу аутентифікації, який можна зробити з --basic, --digest, --ntlm та --negotiate.


1

Є ще одне рішення для тестування API на сервері розробки.

  • Встановити HTTP Basic Authenticationлише для веб-маршрутів
  • Залиште всі маршрути API вільними від аутентифікації

Конфігурація веб-сервера для nginxта Laravelбуде такою:

    location /api {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;

        auth_basic "Enter password";
        auth_basic_user_file /path/to/.htpasswd;
    }

Authorization: Bearer зробить роботу із захисту сервера розробки від веб-сканерів та інших небажаних відвідувачів.


0

За допомогою nginx ви можете надіслати обидва маркери, подібні до цього (навіть якщо це проти стандартного):

Authorization: Basic basic-token,Bearer bearer-token

Це працює доти, доки основний маркер спочатку - nginx успішно пересилає його на сервер додатків.

І тоді вам потрібно переконатися, що ваша програма може належним чином витягнути носія з вищевказаного рядка.

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