null

Основные методы аутентификации для REST API

Введение

В современном мире микросервисов и REST API существует множество методов аутентификации. Эти методы варьируются в зависимости от конкретных требований системы, но большинство из них является вариацией нескольких основных подходов. Аутентификация играет ключевую роль в защите данных и сервисов, и понимание ее основных принципов важно для разработки безопасных API. В данной статье мы рассмотрим четыре самых распространенных метода аутентификации, используемых в REST API.

Аутентификация и авторизация: в чем разница?

Перед тем как углубиться в методы аутентификации, давайте разберемся в разнице между аутентификацией и авторизацией. Эти термины часто путают, хотя их функции различны.

Аутентификация – это процесс подтверждения личности. Это как предъявление водительских прав, которые подтверждают, что вы – это именно вы.

Авторизация – это проверка права доступа. Например, у вас может быть пропуск, который открывает только определенные двери на рабочем месте, но не все.

Основные методы аутентификации для REST API

1. Схемы HTTP аутентификации (Basic и Bearer)

Протокол HTTP определяет схемы аутентификации безопасности HTTP, такие как:

  • Basic
  • Bearer
  • Digest
  • OAuth
  • и другие...

Мы рассмотрим две самые популярные, которые чаще всего используются для REST API.

Базовая аутентификация (Basic Authentication)

HTTP Basic аутентификация считается устаревшей из-за присущих ей уязвимостей в безопасности, однако, она остается самой простой в использовании. Этот метод предполагает передачу имени пользователя и пароля в заголовке запроса. Эти данные кодируются с использованием Base64, который представляет собой метод кодирования, преобразующий данные в набор символов для безопасной передачи.

Вот пример использования базовой аутентификации в заголовке запроса: Authorization: Basic dP77xQmTEdY93ZxER==

Метод не требует использования cookies, сессий, страниц входа или других специальных решений, а также не требует сложных процедур типа handshake.

Однако, несмотря на простоту, Basic аутентификация не считается безопасной, и её следует использовать только с HTTPS (SSL).

Аутентификация по токену (Bearer Authentication)

Аутентификация по токену (также называемая аутентификацией по токену Bearer) — это схема аутентификации HTTP, которая включает использование токенов безопасности, называемых токенами Bearer.

Название «Bearer аутентификация» можно понимать как «предоставить доступ обладателю этого токена». Токен Bearer предоставляет доступ к определенному ресурсу или URL и обычно представляет собой зашифрованную строку, которая генерируется сервером в ответ на запрос авторизации.

Клиент должен отправить этот токен в заголовке Authorization при запросе защищенных ресурсов: Authorization: Bearer <токен>

Схема аутентификации Bearer была изначально создана как часть OAuth 2.0 в RFC-6750, но иногда используется и отдельно.

Так же, как и базовая аутентификация, аутентификация Bearer должна использоваться только через HTTPS (SSL).

2. API-ключи

API ключи являются широко используемым методом аутентификации в REST API и считаются стандартным решением. Тем не менее, API ключи не являются самым безопасным методом. Этот подход предполагает создание уникального ключа для каждого пользователя при первом входе в систему. Этот ключ используется для подтверждения, что пользователь является тем же, что и при предыдущих запросах.

API ключи часто передаются в строке запроса, что делает их уязвимыми для перехвата. Лучше всего передавать ключ в заголовке Authorization:

Authorization: ApiKey apiKeyValue

Хотя API ключи просты в реализации и применимы в сценариях с ограниченным функционалом (например, только для "чтения"), они остаются подверженными атакам, если ключи попадают в ненадежные руки.

3. OAuth (2.0)

Предыдущие версии этой спецификации, OAuth 1.0 и 1.0a, были значительно сложнее, чем OAuth 2.0. Самое большое изменение в последней версии заключается в том, что больше не требуется подписывать каждый вызов с помощью хэширования с ключом. Наиболее распространенные реализации OAuth используют один или оба из следующих токенов:

  • Токен доступа (access token): отправляется как API-ключ, позволяет приложению получать доступ к данным пользователя; токены доступа могут истекать по времени.
  • Токен обновления (refresh token): является необязательной частью процесса OAuth и используется для получения нового токена доступа, если предыдущий истек. OAuth 2.0 объединяет аутентификацию и авторизацию, позволяя более гибко управлять областью действия и сроком действия.

OAuth 2.0 является лучшим выбором для идентификации персональных учетных записей пользователей и предоставления соответствующих разрешений. В этом методе пользователь входит в систему, которая затем запрашивает аутентификацию, обычно в виде токена. Пользователь передает этот запрос на сервер аутентификации, который либо отклоняет, либо принимает аутентификацию. После этого токен предоставляется пользователю, а затем отправляется тому, кто запрашивает доступ. Такой токен может быть проверен в любое время без участия пользователя и может использоваться в течение ограниченного срока действия и с ограниченной областью доступа.

Эта система значительно более безопасна и мощна по сравнению с другими подходами, главным образом потому, что она позволяет устанавливать области действия (scopes), которые предоставляют доступ к разным частям API-сервиса. Кроме того, токен аннулируется после определенного времени, что затрудняет его повторное использование злоумышленниками.

Популярные потоки OAuth 2.0

Потоки (также называемые типами грантов) — это сценарии, при которых API-клиент получает токен доступа от сервера авторизации.

OAuth 2.0 предоставляет несколько популярных потоков, подходящих для различных типов API-клиентов:

  • Authorization code (Код авторизации) – Самый распространенный поток, в основном используется для серверных и мобильных веб-приложений. Этот поток похож на процесс регистрации пользователей в веб-приложении с использованием учетной записи.
  • Implicit (Имплицитный поток) – Этот поток требует, чтобы клиент напрямую получил токен доступа. Это полезно в случаях, когда учетные данные пользователя не могут храниться в коде клиента, поскольку они могут быть легко доступны третьим лицам. Подходит для веб-, настольных и мобильных приложений, которые не имеют серверного компонента.
  • Resource owner password (Пароль владельца ресурса) – Требует ввода имени пользователя и пароля. Поскольку в этом случае учетные данные будут частью запроса, этот поток подходит только для доверенных клиентов (например, официальных приложений, выпущенных провайдером API).
  • Client Credentials (Учетные данные клиента) – Предназначен для аутентификации между серверами, этот поток описывает подход, при котором клиентское приложение действует от своего имени, а не от имени конкретного пользователя. В большинстве сценариев этот поток позволяет пользователям указывать свои учетные данные в клиентском приложении, чтобы оно могло получать доступ к ресурсам под контролем клиента.

4. OpenID Connect

OpenID Connect — это простая идентификационная надстройка над протоколом OAuth 2.0, которая позволяет клиентам вычислительной системы проверять личность конечного пользователя на основе аутентификации, выполненной сервером авторизации, а также получать основную информацию о профиле пользователя в совместимом и REST-подобном формате.

С технической точки зрения, OpenID Connect использует RESTful HTTP API и JSON как формат данных.

OpenID Connect позволяет различным клиентам, включая веб-клиенты, мобильные и JavaScript-клиенты, запрашивать и получать информацию о подтвержденных сеансах и конечных пользователях. Спецификация является расширяемой и поддерживает дополнительные функции, такие как шифрование данных идентификации, обнаружение OpenID-провайдеров и управление сеансами.

OpenID Connect определяет поток входа, который позволяет клиентскому приложению аутентифицировать пользователя и получать информацию (или «claims») об этом пользователе, такую как имя пользователя, электронная почта и т. д. Информация о личности пользователя кодируется в безопасном JSON Web Token (JWT), называемом ID-токеном.

JSON Web Token (JWT) — это открытый стандарт (RFC 7519), представляющий собой метод безопасного представления заявлений между двумя сторонами. JWT позволяет декодировать, проверять и генерировать токены. Хотя JWT является стандартом, он был разработан компанией Auth0, которая занимается управлением идентификацией и аутентификацией с помощью API.

OpenID Connect определяет механизм обнаружения, называемый OpenID Connect Discovery, при котором сервер OpenID публикует свои метаданные по известному URL-адресу, обычно https://server.com/openid-configuration.

Этот URL возвращает JSON-список конечных точек OpenID/OAuth, поддерживаемые области и заявления, открытые ключи, используемые для подписания токенов, и другие детали. Клиенты могут использовать эту информацию для формирования запроса к серверу OpenID. Имена полей и значения определены в спецификации OpenID Connect Discovery.

Небольшое обобщение

Базовая аутентификация API

  • Легко реализуется, поддерживается практически всеми веб-серверами.
  • Включает отправку имени пользователя и пароля, закодированных в Base-64.
  • Не должна использоваться без SSL.
  • Легко комбинируется с другими методами безопасности.

Примечание: базовая аутентификация очень уязвима для перехвата и атак типа "человек посередине" при отсутствии шифрования. Из-за этого ограничения этот метод аутентификации рекомендуется использовать только в сочетании с SSL.

OAuth1.0 (схема Digest)

  • Популярный, проверенный, безопасный, основанный на сигнатуре, хорошо определённый протокол.
  • Использует криптографическую подпись, которая представляет собой комбинацию секретного токена, nonce и другой информации на основе запроса.
  • Может использоваться как с SSL, так и без него.

OAuth2 (схема Bearer Token)

  • Текущая спецификация OAuth2 устраняет необходимость в криптографических подписях, паролях и именах пользователей.
  • OAuth2 работает с различными сценариями аутентификации, называемыми "потоками", которые включают:
    • Поток с кодом авторизации (Authorization Code flow)
    • Имплицитный поток (Implicit flow)
    • Поток пароля владельца ресурса (Resource Owner Password flow)
    • Поток учетных данных клиента (Client Credentials flow)

OpenID Connect Discovery

  • Основан на протоколе OAuth 2.0.
  • Использует поток входа, который позволяет клиентскому приложению аутентифицировать пользователя и получать доступ к информации.
  • Информация о пользователе кодируется с помощью безопасного токена JSON Web Token (JWT).

Заключение

Из четырех рассмотренных методов, наиболее предпочтительным для аутентификации и авторизации в REST API является OAuth 2.0. Он предлагает множество преимуществ, таких как простота использования, поддержка различных сценариев и высокий уровень безопасности. OpenID Connect набирает популярность благодаря своей интеграции с OAuth 2.0 и возможности работы с пользовательскими данными. Тем не менее, API ключи и схемы HTTP аутентификации все еще могут быть применимы в специфических сценариях, особенно в условиях ограниченного функционала.

Выбор подходящего метода аутентификации зависит от конкретных требований безопасности и задач, стоящих перед вашим API.