Базовая аутентификация 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-адресами, это не лучшее решение. Так я что-то упускаю?

Azngeek
источник
2
Мне нужно пройти аутентификацию через HTTP Basic, так как сервер Dev защищен им, и мне нужна аутентификация на основе токенов для api. Но поскольку я использую curl для тестирования API, мне нужен способ отправить оба заголовка аутентификации. Итак, первый (базовый) для передачи HTTP Basic и второй (токен) для аутентификации в моем приложении. И да, это мое собственное творение.
Azngeek 06
1
Вы когда-нибудь в этом разбирались? Я добавляю награду
Адам Уэйт
4
Привет, Адам, к сожалению, нет. Теперь я изменил способ работы аутентификации, изменив заголовок авторизации для токена на «x-auth», который не является стандартным заголовком.
Azngeek
1
Мой сервер nginx даже не примет 2 заголовка авторизации. Он возвращает 400 Bad request. Глупо.
Руди
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
Привет, Сабудж, проблема не в том, как вы передаете имя пользователя и пароль, а в том, что несколько заголовков авторизации просто не работают. Глядя на спецификации ( ietf.org/rfc/rfc2617.txt ), я вижу, что это должно быть возможно. Но, как также сказано: «Пользовательский агент ДОЛЖЕН выбрать использование одной из задач с самой сильной схемой аутентификации, которую он понимает, и запросить учетные данные у пользователя на основе этой задачи». Как будто я написал 2 дня назад, мне нужно было пройти токен в нестандартный заголовок, что абсолютно нормально, когда вы имеете дело с нестандартными архитектурами.
Azngeek
5
@Azngeek Curl отправляет оба заголовка авторизации, когда вы выполняете задачу. Вам нужно обрабатывать это со стороны вашего сервера. Просто запустите команду curl с обоими заголовками с -vпараметром param. Вы обнаружите, что его отправка Authorization: Basic Ym9zY236Ym9zY28=, Authorization: Bearer mytoken123в заголовке запроса. Со стороны сервера, если вы проверите, вы обнаружите, что у вас есть заголовок авторизации, подобный этому, Authorization: Basic Ym9zY236Ym9zY28=, Bearer mytoken123разделенный запятой. Итак, я решил предложить вам альтернативы.
Sabuj Hassan
34

Стандарт ( https://tools.ietf.org/html/rfc6750 ) говорит, что вы можете использовать:

  • Закодированный в форме параметр тела: Авторизация: носитель mytoken123
  • Параметр запроса URI: access_token = mytoken123

Таким образом, можно передать множество токенов-носителей с URI, но делать это не рекомендуется (см. Раздел 5 стандарта).

Янек Ольшак
источник
4

Если вы используете обратный прокси-сервер, такой как nginx между ними, вы можете определить собственный токен, например X-API-Token.

В nginx вы бы переписали его для восходящего прокси (вашего остального api), чтобы он был просто auth:

proxy_set_header Authorization $http_x_api_token;

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

измельчение
источник
3

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

Iiridayn
источник
Непонятно, почему проголосовали против. Я наткнулся на этот вопрос в поисках ответа на связанную проблему - вот как я ее решил. CookieЗаголовок уже часто используется для проверки подлинности.
Iiridayn
2

curl --anyauth

Сообщает curl, чтобы он сам определил метод аутентификации и использовал наиболее безопасный, который, по утверждениям удаленного сайта, поддерживает. Для этого сначала выполняется запрос и проверяются заголовки ответов, что, возможно, вызывает дополнительный круговой обход сети. Это используется вместо установки определенного метода аутентификации, который вы можете сделать с помощью --basic, --digest, --ntlm и --negotiate.

bbaassssiiee
источник
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 успешно перенаправляет его на сервер приложений.

И затем вам нужно убедиться, что ваше приложение может правильно извлекать Bearer из указанной выше строки.

Лачо Томов
источник