Как передавать параметры в Basic Authorization, в том числе через URL
Что проверяют
Знаете ли вы, как схема Basic устроена на уровне HTTP, и можете ли проверить её руками и в автотестах. Тестировщику важен не только формат заголовка, но и ответы сервера без него, с неверным паролем и со спецсимволами. Следом часто спрашивают, чем плох логин и пароль в URL.
Как отвечать
- заголовок:
Authorization: Basic <base64(login:password)>. Base64 это кодирование, а не шифрование: строка раскодируется за секунду, поэтому Basic имеет смысл только поверх HTTPS; - ответ без авторизации: сервер возвращает 401 и заголовок
WWW-Authenticate: Basic realm="...", по нему браузер показывает окно входа. Неверный пароль тоже даёт 401, а 403 означает, что пользователь опознан, но прав у него нет; - через URL: формат
https://login:password@host/path. RFC 3986 называетuser:passwordв URL устаревшим, браузеры такие адреса ограничивают:fetchс учётными данными в адресе выбрасывает ошибку, Chrome блокирует их во вложенных запросах. Пароль из URL остаётся в истории, логах прокси и на скриншотах; - спецсимволы: символы
@,:,/в пароле внутри URL нужно процентно кодировать, иначе адрес разберётся неправильно. Двоеточие в логине недопустимо вообще, это разделитель; - инструменты: в Postman вкладка Authorization, тип Basic Auth, заголовок соберётся сам. В curl
curl -u login:password https://host, в REST Assuredgiven().auth().preemptive().basic(login, password).
Хороший набор проверок: без заголовка, неверный пароль, пустой пароль, логин в другом регистре, кириллица и спецсимволы в пароле, HTTP вместо HTTPS, старый пароль после его смены.
Где спотыкаются
Называют Base64 шифрованием и считают схему Basic безопасной самой по себе. Без TLS пароль виден любому, кто видит трафик, и повторяется в каждом запросе.
Путают параметры ?user=...&password=... с Basic-аутентификацией. Это другой механизм, и он хуже: пароль в query оседает в логах сервера.
Ожидают 403 на неверный пароль или не проверяют WWW-Authenticate в ответе 401, хотя без него клиент не узнает, какую схему использовать.