Я разрабатываю REST API, используя авторизацию / аутентификацию через ключ API.
Я попытался выяснить, что является лучшим местом для этого, и обнаружил, что многие люди предлагают использовать собственный заголовок HTTP ProjectName-Api-Key
, например, например:
ProjectName-Api-Key: abcde
но также возможно и идеологически правильно использовать Authorization
заголовок с пользовательской схемой, например:
Authorization: ApiKey abcde
С другой стороны, я обнаружил соображение, что настраиваемая схема авторизации может быть неожиданной и неподдерживаемой некоторыми клиентами и в любом случае приводить к настраиваемому коду, поэтому лучше использовать настраиваемый заголовок, поскольку клиенты не имеют никаких ожиданий по этому поводу.
Каким способом вы бы предпочли отправить ключ API?
Authorization: Bearer <token>
заголовок, и с этим никогда не было проблем. Токены являются JWT s.Bearer
схема используется исключительно с oAuth2. Применение его отдельно от oAuth звучит как злоупотребление им. Почему правильно использовать эту схему, если нет oAuth? Кстати, у меня были проблемы с выбором типа авторизации для моего API. API будет доступен только для одной доверенной службы, поэтому я исследовал поток учетных данных клиента oAuth2 и не нашел никаких преимуществ по сравнению с ApiKey в моем случае.ApiKey
была переименована и интерпретирована какAccess Token
предоставленная клиенту без истечения срока действия. Это своего рода философский аспект, я решил не приводить сложных определений, если мой случай можно описать простыми словами, и решил просто назвать его «ApiKey». Если ваш протокол реализует стандарт oAuth, я могу согласиться на использованиеBearer
, но это не так, я думаю, что эту схему нельзя применить.Ответы:
Если вы используете авторизацию, будьте последовательны
Некоторые утверждают, что следующее не является необходимым ( и не так давно я бы с ними согласился ), но в наши дни, если мы используем
Authorization
заголовок, мы должны сообщить тип токена, потому что ключи API сами по себе не описательны. 1 .Почему я считаю это необходимым и почему я считаю это важным? Потому что в настоящее время поддержка различных протоколов аутентификации / авторизации стала обязательной. Если мы планируем использовать
Authorization
заголовок для всех этих протоколов, мы должны сделать нашу аутентификацию согласованной. Способ сообщения о том, какой токен мы отправляем и какой протокол авторизации должен применяться, также должен быть указан в заголовке.Раньше я не заботился об этом, но после работы с клиентскими приложениями, чьи обновления не были гарантированы (в основном мобильные телефоны и датчики), я начал это делать. Я начал проявлять осторожность в том, как внедряю безопасность, чтобы я мог расширять ее, не связываясь с клиентами и не слишком мучаясь на стороне сервера.
Обеспокоенность
Проблемы, с которыми я столкнулся при реализации своих собственных схем, были аналогичны тем, которые были прокомментированы.
Скажем клиенты , скажем библиотеки, фреймворки, обратные прокси .
преимущества
Одним из важных преимуществ является кэш. Общие кэши не будут кэшировать заголовок (и это, конечно, хорошо), если вы не скажете иначе.
Так авторизация или пользовательский заголовок?
По моему опыту, реализация моей собственной
Authorization
схемы заняла у меня тот же объем работы (или больше), что и реализация пользовательских заголовков авторизации, с небольшой разницей в большей свободе проектирования и большем контроле над кешем, когда я использовал собственные заголовки. Причина довольно глупая, в большинстве случаев у меняCache-control
установлен параметрno-cache
илиno-store
, позволяющий мне делать вызовы на сервер более детерминированными (это важно, когда дело доходит до отслеживания и тестирования) независимо от топологии сети.1: Я считаю, что этот ответ очень ясен в отношении ключей API
источник
X-