API-ключ, Basic, Bearer
↑ 1.3 Аутентификация и безопасность API · ← Предыдущая · → Следующая
Зачем это аналитику и PM
В коллекции и в баге допуск выглядит по-разному: длинный ключ, строка Basic или Bearer. Путаница места, куда его класть, даёт ложный
401, а вставка секрета в чат даёт чужой доступ.
План темы
- где передаются
- как выглядят
- где хранить
- ротация ключей
Объяснение
API-ключ, Basic и Bearer — три частых способа предъявить допуск в HTTP. Все три отвечают на шаг «кто вы» или «какое приложение стучится». Что этому субъекту можно, решается отдельно.
Как три вида пропусков. Ключ — постоянный бейдж интеграции. Basic — имя и пароль на одной карточке. Bearer — разовый талон «предъявитель»: кто принёс талон, того и обслуживают, пока срок не вышел. Талон не кладут на видное место.
Как выглядят и где едут
Ключ — длинная случайная строка. Имя заголовка не универсально: встретите и X-Api-Key, и имя из документации партнёра. Класть ключ в query опасно: адрес попадает в журналы и историю. Если партнёр требует ключ только в адресе, это их ограничение, его фиксируют и не копируют в новые API без причины.
Basic собирает имя и пароль, кодирует их в Base64 и ставит в заголовок Authorization. Base64 — не шифрование, строку легко прочитать обратно. Поэтому Basic без HTTPS не используют. В примере ниже пароль вымышленный.
Bearer тоже живёт в Authorization, но значение — токен, часто выданный другим шагом входа. Слово Bearer значит «предъявитель». Сам токен может быть непрозрачной строкой или JWT. Формат токена не меняет имя заголовка.
| Способ | Куда обычно кладут | На кого похож |
|---|---|---|
| API-ключ | Заголовок, имя смотрите в документации | Долгоживущий доступ приложения |
| Basic | Authorization: Basic ... | Имя и пароль учётной записи |
| Bearer | Authorization: Bearer ... | Токен после входа или выдачи |
Где хранить и как менять
Секрет не живёт в переписке, в скриншоте, в git и в экспортнутой коллекции «для всех». Ему место в хранилище секретов команды или в секретной переменной клиента запросов, которую не выгружают в общий файл. В примеры для задачи подставляют ***.
Ротация — плановая замена. Новый ключ начинают принимать, старый ещё работает короткий согласованный срок, затем старый гасят. Срок перекрытия берёте у владельца ключа, не из этой заметки. Утечку не ждут до плановой даты: ключ гасят сразу и выпускают новый. После гашения старые запросы получат 401, это ожидаемо, не поломка контракта полей.
Примеры
Три схемы заголовка. Хост учебный, секреты не настоящие. Строка Basic — Base64 от текста user:example, его можно раскодировать обратно, в этом и смысл предупреждения.
GET /orders HTTP/1.1
Host: api.example.com
X-Api-Key: ***GET /orders HTTP/1.1
Host: api.example.com
Authorization: Basic dXNlcjpleGFtcGxlGET /orders HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJ...Нюансы и подводные камни
- Ключ интеграции — не пользователь. Им нельзя изображать действие конкретного сотрудника, если контракт этого не обещает.
- Один ключ на тест и на бой стирает границу стендов. Утечка тестовой коллекции тогда открывает прод.
- Basic с боевым паролем в Postman легко уехать в экспорт. Пароль держат вне файла коллекции.
Bearerбез пробела или с кавычками вокруг токена часто даёт401, хотя токен живой.
Практика
По документации вашего тестового API или по учебному описанию выпишите: способ допуска, имя заголовка и куда секрет класть нельзя.
Ожидаемый результат: одна строка вида «Bearer в Authorization, значение в секретной переменной, в пример только маска». Если имя заголовка ключа неизвестно, стоит вопрос владельцу, а не выдуманное X-Api-Key как факт вашего сервиса.
Вопросы с ответами
Почему Base64 в Basic не защищает пароль?
Это кодировка, чтобы передать двоичные байты в тексте заголовка. Любой может раскодировать строку обратно. Защищает канал HTTPS, а не сама запись Basic.
Чем ключ отличается от Bearer-токена?
Ключ обычно долго живёт и выдан приложению или партнёру. Bearer чаще выдают на сессию или на ограниченный срок и носят как талон предъявителя. Точные сроки смотрите у того, кто токен выпускает.
Куда писать ключ в баге?
Только имя заголовка и маску
***. Само значение в чат, тикет и скрин не попадает. После случайной публикации ключ считают скомпрометированным и меняют.
Что такое ротация?
Замена секрета, пока интеграция не останавливается насовсем: новый уже принимают, старый гасят после короткого перекрытия. Длину перекрытия называет владелец ключа.