What is the OAuth 2.0 Bearer Token exactly? – Stack Overflow

Аутентификация на основе токенов

Этот способ был введен для устранения основанного на куках аутентификации. Особенности подхода – требуется ручная реализация и токены сохраняются на стороне клиента.

Когда вы входите в
веб-приложение, сервер проверяет учетные данные и отправляет зашифрованный
токен в браузер. Браузер сохраняет токен и добавляет его в заголовок авторизации
будущих запросов.

Стандартные реализации
токен-подхода в разы сложнее описанных выше. Например, в
OpenID Connect применяется несколько потоков аутентификации для различных сценариев использования. Чтобы лучше понять, как работают токены, разобьем процесс на четыре части и в качестве примера используем JWT (JSON Web Token) – наиболее широко используемый стандарт.

Зависимости

Мы запускаем приложение как обычное Весенняя загрузка Приложение. Добавьте Spring Web для стандартных API REST и Spring Security для части безопасности — загрузите и распакуйте архив.

Нам также нужно добавить зависимости io.jsonwebtoken JWT . Обратите внимание, что две зависимости JWT скопированы из maven central как зависимости времени выполнения, потому что они не нужны на этапе компиляции, только во время выполнения вашего приложения. Единственная зависимость, которая вам нужна для компиляции, – это jjwt-api .

Интерфейс службы Токенов

Для примера операции с токенами разделены на Служба токенов интерфейс, который выглядит следующим образом:

Пользователь является сущностью в приложении и выглядит так:

Принципал пользователя является Принципалом объект, который будет находиться в контексте безопасности Spring. Принципал – это пользователь, который в данный момент вошел в приложение. Позже мы рассмотрим, как установить его в контексте безопасности Spring .

Пользовательский принцип выглядит так:

Сервер проверяет учетные данные, генерирует токен, подписывает его секретным ключом и отправляет в браузер

При передаче обычно необходимо
использовать шифрование (например, SSL) для защиты канала.

На стороне сервера можно
использовать библиотеку NPM (такую как jsonwebtoken) для
создания токенов:

Сервер отправляет файл cookie браузеру, включая его в заголовок Set-Cookie

В дополнение к этому в
cookie могут храниться такие сведения, как дата истечения срока действия, домен
и возраст. Пример ответа с несколькими заголовками cookie будет выглядеть
следующим образом:

Служба токенов JWT (Реализация)

Нам нужно реализовать два метода: один для генерации токенов и один для анализа токенов. (JWT_SECRET – это строка)

Сохранение токена в хранилище браузера и добавление в запросы с помощью JavaScript

Браузер может хранить
этот маркер в локальном хранилище, хранилище сеансов или в хранилище cookies.
Затем он будет добавлен в заголовок авторизации и отправлен на сторону сервера
для валидации запросов.

Добавление токена в заголовок должно быть реализовано с помощью JavaScript.

Authorization: Bearer <token>

Кроме того, можно использовать
функцию jwt.decode() из библиотеки jsonwebtoken для декодирования токена.

Браузер сохраняет cookie в хранилище и отправляет его с последующими запросами

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

Найти все сохраненные в браузере файлы cookie можно в хранилище файлов cookie в разделе
приложения с помощью инструментов разработчика (devtools).

При выходе пользователя из системы токен вручную удаляется из хранилища

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

Мы разобрались, как
работает аутентификация на основе токенов, теперь рассмотрим фичи, плюсы и
минусы этой схемы.

Фильтр аутентификации/Авторизации

В приведенном примере мы расширяем OncePerRequestFilter , цель которого – гарантировать однократное выполнение каждой отправки запроса.

Простая проверка выполняется, если присутствует заголовок “Авторизация” (часто используемый для передачи токенов на предъявителя).

Когда пользователь выйдет из системы, сервер удалит сеанс из базы данных

Как только пользователь
выйдет из системы, у сервера истечет срок действия файла cookie и сеанс в базы данных будет очищен. Браузер делает то же самое, удаляя файл cookie из хранилища.

Мы разобрались, как
работает аутентификация на основе cookie, теперь рассмотрим фичи, плюсы и
минусы этой схемы.

Пример конечной точки

Здесь у нас есть три примера конечных точек:

Cookie-based authentication

Аутентификация – это процесс обмена учетными данными для идентификации пользователя. При аутентификации на основе cookies уникальный идентификатор (файл cookie) создается на стороне сервера и отправляется в браузер.

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

Чтобы лучше понять, как
работают файлы cookie, разобьем этот процесс на 5 частей.

Disadvantage of bearer tokens

The downside to Bearer tokens is that there is nothing preventing other apps from using a Bearer token if it can get access to it. This is a common criticism of OAuth 2.0, although most providers only use Bearer tokens anyway. Under normal circumstances, when applications properly protect the access tokens under their control, this is not a problem, although technically it is less secure.

Oauth 1.0

In OAuth 1, there are two components to the access token, a public and private string. The private string is used when signing the request, and never sent across the wire.

Oauth 2.0: bearer token usage – русские блоги

Bearer Token (RFC 6750) Он используется для OAuth 2.0 для авторизации доступа к ресурсам.Любой держатель носителя может использовать его для доступа к связанным ресурсам без разбора без необходимости доказывать, что он владеет ключом шифрования. Несущий представляет собой область авторизации, срок действия и другие элементы авторизации; Носитель должен предотвращать утечку во время хранения и передачи, и должна быть реализована безопасность транспортного уровня (TLS); срок действия Носителя не может быть слишком длинным, и его можно продлить с помощью токена обновления по истечении его срока.

1. Запрос ресурса

  У Bearer есть три способа реализации запросов ресурсов: заголовок авторизации, параметр тела с кодировкой формы и параметр запроса URI.Приоритет этих трех методов уменьшается по порядку.

2. Заголовок WWW-Authenticate

В случае, если клиент не отправляет действительный носитель, то есть при возникновении ошибки, сервер ресурсов должен отправить заголовок WWW-Authenticate. Ниже приведен пример:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example", error="invalid_token", error_description="The access token expired"

  Далее будет подробно описано использование поля WWW-Authenticate (следующие атрибуты / команды не должны использоваться повторно):

  • Bearer: Beare, как тип аутентификации (на основе OAuth 2.0), определяется ключевым словом Bearer.
  • realm: Подобно Basic и Digest, Bearer также использует то же значение reaml определения домена.
  • scope: Диапазон авторизации, необязательный, с учетом регистра, список через пробел (% x21 /% x23-5B /% x5D-7E), который может быть любым значением, определенным сервером авторизации, и не должен отображаться для конечных пользователей. OAuth 2.0 также предусматривает, что клиент отправляет параметры запроса области действия, чтобы указать область авторизованного доступа, и когда фактическая область авторизации несовместима с областью авторизации запроса клиента, сервер авторизации может отправить параметр ответа области, чтобы проинформировать клиента о фактической области авторизации выданного токена. Ниже приведены два примера использования области:
    scope="openid profile email"
    scope="urn:example:channel=HBO&urn:example:rating=G,PG-13"
  • error: Опишите причину отказа в запросе доступа в пределах символов% x20-21 /% x23-5B /% x5D-7E
  • error_description: Предоставьте разработчику понятное объяснение в пределах символов% x20-21 /% x23-5B /% x5D-7E
  • error_uri: Абсолютный URI, который идентифицирует страницу с ошибкой интерпретации, понятной человеку, в пределах символов% x21 /% x23-5B /% x5D-7E

При возникновении ошибки код состояния HTTP (обычно 400, 401, 403 или 405) и код ошибки, отправляемые сервером ресурсов, выглядят следующим образом:

  • invalid_request: В запросе отсутствуют параметры или недопустимые параметры, значения, повторяющиеся параметры, несколько методов для отправки токенов доступа, неверный формат и т. Д. Сервер ресурсов отправит HTTP 400 (неверный запрос)
  • invalid_token: Срок действия токена доступа истек, он отозван, деформирован или существует другая недействительная причина. Сервер ресурсов отправит HTTP 401 (неавторизованный), и клиенту необходимо подать заявку на новый токен доступа перед повторной отправкой запроса ресурса.
  • insufficient_scope: Разрешения токена доступа, предоставленного клиентом, слишком низкие. Сервер ресурсов отправит HTTP 403 (Запрещено), а заголовок WWW-Authenticate содержит атрибут области, чтобы указать требуемый объем полномочий.

  Если в запросе ресурса, отправленном клиентом, отсутствует какая-либо информация аутентификации (например, отсутствие токена доступа или использованиеRFC 6750Любой метод, кроме трех указанных методов запроса ресурса), сервер ресурсов не должен включать код ошибки или другую информацию об ошибке в ответ, как показано ниже:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example"

3. Ответ токена на предъявителя

  Ниже приведен пример:

What is the OAuth 2.0 Bearer Token exactly? - Stack Overflow

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
   "access_token":"mF_9.B5f-4.1JqM",
   "token_type":"Bearer",
   "expires_in":3600,
   "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA"
}

What is the OAuth 2.0 Bearer Token exactly? - Stack Overflow

4. Угрозы безопасности

  • Подделка / модификация токена (изготовление / модификация токена): Злоумышленник подделывает или изменяет существующий токен, в результате чего сервер ресурсов авторизует клиента с незаконным доступом. Поэтому для токена необходимо использовать цифровую подпись или код аутентификации сообщения, чтобы обеспечить его целостность.
  • Раскрытие токена: Сам токен может содержать конфиденциальную информацию, такую ​​как аутентификация и срок действия. Следовательно, необходимо реализовать TLS и проверить сертификат. Зашифрованный токен можно использовать для предотвращения наблюдения клиентом за содержимым токена. Зашифрованный токен также может предотвратить утечку токена между интерфейсным сервером и внутренним сервером (если они не включают TLS)
  • Перенаправление токена: Злоумышленник использует токен для доступа к серверу ресурсов A, чтобы запросить ресурсы сервера ресурсов B. Следовательно, токен обычно может содержать идентификатор, представляющий сервер ресурсов, чтобы этого не произошло.
  • Воспроизведение токена: Злоумышленник пытается использовать токены, которые использовались для запроса ресурсов. Следовательно, токен должен иметь срок действия (например, менее 1 часа).

Кроме того, файлы cookie не могут содержать токены, что касается уязвимостей файлов cookie, связанных с безопасностью,RFC 6265Есть следующие описания:

What is the OAuth 2.0 Bearer Token exactly? - Stack Overflow

  A server that uses cookies to authenticate users can suffer security
   vulnerabilities because some user agents let remote parties issue
   HTTP requests from the user agent (e.g., via HTTP redirects or HTML
   forms).  When issuing those requests, user agents attach cookies even
   if the remote party does not know the contents of the cookies,
   potentially letting the remote party exercise authority at an unwary
   server.

What is the OAuth 2.0 Bearer Token exactly? - Stack Overflow

Видно, что даже если сервер реализует TLS, злоумышленник все еще может использовать файлы cookie для получения конфиденциальной информации, если файл cookie содержит конфиденциальную информацию; для этого конфиденциальная информация должна быть включена в URL-адреса (при условии, что TLS был реализован), но попробуйте использовать Более безопасный метод, поскольку история браузера, журналы сервера и т. Д. Могут раскрывать конфиденциальную информацию об URL-адресах.

V. Безопасность транспортного уровня (TLS)

  TLS (SSL / TLS) происходит от SSL (Secure Sockets Layer, 1994 / SSL 1.0, 1995 / SSL 2.0, 1996 / SSL 3.0), разработанного NetScape; в 1999 году IETF пришла на смену NetScape и выпустила обновленную версию SSL, TLS 1.0, последнюю Как TLS 1.3 (черновик), TLS используется для обеспечения конфиденциальности и целостности данных между двумя коммуникационными приложениями. В настоящее время наиболее широко используется TLS 1.0, за которым следует SSL 3.0, а в основных браузерах уже реализована поддержка TLS 1.2. TLS 1.0 обычно обозначается как SSL 3.1, TLS 1.1 – как SSL 3.2, а TLS 1.2 – как SSL 3.3. Для получения дополнительной информации см.TLS 1.2 / RFC 5246 。

TLS – это уровень протокола, расположенный между транспортным уровнем (TCP) и уровнем приложения. Он состоит из двух уровней: уровня записи и уровня установления связи:

   What is the OAuth 2.0 Bearer Token exactly? - Stack Overflow

Набор алгоритмов TLS состоит из трех частей: Для получения дополнительной информации см.http://www.rfcreader.com/#rfc5246_line3649

  What is the OAuth 2.0 Bearer Token exactly? - Stack Overflow

  1. Алгоритм обмена ключами: различные варианты RSA или алгоритма Диффи-Хеллмана
  2. Алгоритм шифрования: AES, DES, Triple-DES, RC4, RC2, IDEA или нет
  3. Алгоритм дайджеста: MD5, SHA

6. Тип носителя application / x-www-form-urlencoded

  Прежде всегоapplication/x-www-form-urlencodedЭтот тип кодирования не учитывает случай символов ASCII, отличных от США, поэтому кодируемое содержимое (включая имя и значение) может быть сначала закодировано с помощью UTF-8, а затем выполняются операции escape-символа в соответствии с последовательностью байтов; и этот тип данных принимается Требуется обратная обработка. Как правило, различные языки веб-программирования предоставляют собственные интерфейсы кодирования / декодирования URL-адресов (кодирование / декодирование URL-адресов может отличаться в разных языковых версиях), и это также чрезвычайно удобно в использовании, поэтому я не буду подробно их здесь представлять.

Семь. MAC Token

  Токен MAC, как и токен-носитель, может использоваться в качестве типа токена доступа OAuth 2.0, но токен-носитель является стандартом, рекомендованным RFC; токен MAC –MAC Access AuthenticationКак определено в, алгоритм кода аутентификации сообщения (MAC) используется для обеспечения проверки целостности.

  MAC Access AuthenticationЭто схема аутентификации HTTP. Подробнее см.HTTP Authentication: MAC Access Authentication draft-hammer-oauth-v2-mac-token-05 。

What is bearer token?

Bearer Tokens are the predominant type of access token used with OAuth 2.0. A Bearer Token is an opaque string, not intended to have any meaning to clients using it. Some servers will issue tokens that are a short string of hexadecimal characters, while others may use structured tokens such as JSON Web Token.

What is the oauth 2.0 bearer token exactly?

As I read your question, I have tried without success to search on the Internet how Bearer tokens are encrypted or signed. I guess bearer tokens are not hashed (maybe partially, but not completely) because in that case, it will not be possible to decrypt it and retrieve users properties from it.

But your question seems to be trying to find answers on Bearer token functionality:

Suppose I am implementing an authorization provider, can I supply any
kind of string for the bearer token? Can it be a random string? Does
it has to be a base64 encoding of some attributes? Should it be
hashed?

So, I’ll try to explain how Bearer tokens and Refresh tokens work:

When user requests to the server for a token sending user and password through SSL, the server returns two things: an Access token and a Refresh token.

An Access token is a Bearer token that you will have to add in all request headers to be authenticated as a concrete user.

Authorization: Bearer <access_token>

An Access token is an encrypted string with all User properties, Claims and Roles that you wish. (You can check that the size of a token increases if you add more roles or claims).
Once the Resource Server receives an access token, it will be able to decrypt it and read these user properties. This way, the user will be validated and granted along with all the application.

Access tokens have a short expiration (ie. 30 minutes).
If access tokens had a long expiration it would be a problem, because theoretically there is no possibility to revoke it. So imagine a user with a role=”Admin” that changes to “User”. If a user keeps the old token with role=”Admin” he will be able to access till the token expiration with Admin rights.
That’s why access tokens have a short expiration.

But, one issue comes in mind. If an access token has short expiration, we have to send every short period the user and password. Is this secure? No, it isn’t. We should avoid it. That’s when Refresh tokens appear to solve this problem.

Refresh tokens are stored in DB and will have long expiration (example: 1 month).

A user can get a new Access token (when it expires, every 30 minutes for example) using a refresh token, that the user had received in the first request for a token.
When an access token expires, the client must send a refresh token. If this refresh token exists in DB, the server will return to the client a new access token and another refresh token (and will replace the old refresh token by the new one).

In case a user Access token has been compromised, the refresh token of that user must be deleted from DB. This way the token will be valid only till the access token expires because when the hacker tries to get a new access token sending the refresh token, this action will be denied.

What is the use of bearer token?

Bearer Token A security token with the property that any party in possession of the token (a “bearer”) can use the token in any way that any other party in possession of it can. Using a bearer token does not require a bearer to prove possession of cryptographic key material (proof-of-possession).

Безопасность

Cookie не имеют надежной защиты от атак, и они в основном уязвимы для атак с использованием межсайтового скриптинга (XSS) и подделки межсайтовых запросов (CSRF).

Мы можем явно изменить заголовки файлов cookie, чтобы защитить их от таких атак.

Генерация токенов

Мы используем Jwts.builder() для создания нашего токена и создания его в виде компактного токена. В примере мы используем его для установки id , sub и администратор утверждает, но вы можете добавлять любые утверждения, какие захотите.

Претензия – это часть информации, которая будет добавлена в тело вашего JWTS. Есть некоторые стандартные утверждения, такие как sub (тема), iss (эмитент), …, которые вы можете посмотреть здесь .

Мы добавляем “Носитель” с пустым пространством в качестве префикса, чтобы указать, что схема аутентификации имеет тип Носитель .

Название “Аутентификация на предъявителя” можно понимать как “предоставление доступа носителю этого токена”.

Это один из моментов, в котором вам нужно будет принять несколько решений:

  1. Каково будет время истечения срока действия ваших токенов?

    • Это будет очень сильно зависеть от ваших вариантов использования. Существуют варианты использования для очень больших окон истечения срока действия, таких как 1 неделя, 1 день, 8 часов. Или очень маленькие окна истечения срока действия, такие как 1 час, 30 минут, 10 минут.
    • Для примера достаточно 1 часа.
  2. В чем был бы ваш секрет ? — Секрет в том, что будет использоваться для подписи ваших JWTS, чтобы вы могли проверить это позже при разборе. Длина секрета будет зависеть от используемого вами алгоритма подписи, и вы можете сгенерировать какой-нибудь случайный секрет с ее веб-сайта .
  3. Какой будет ваша секретная стратегия ? Или как вы собираетесь управлять секретами.

    • Вы можете использовать один секрет и подписывать им все свои JWT. Вы можете иметь секреты для каждого пользователя и хранить их в своей базе данных. Вы можете иметь секреты для каждого токена и хранить их как в токене, так и в базе данных. (Примечание: Одна из идей JWT состоит в том, чтобы не искать в БД для аутентификации пользователей)
    • Возможно, есть и другие стратегии, но я их не видел, поэтому я не перечисляю их здесь.
    • Для примера, использование одного секрета для подписи всех моих JWT – это нормально.
  4. Каким был бы ваш алгоритм подписи ? – JWTS используют алгоритм HMAC SHA, который является алгоритмом, используемым для проверки целостности данных (аутентификации данных). Для JWTS стандартно использовать HS256, но вы можете пойти дальше и использовать HS512. Длина вашего секрета зависит от алгоритма HS256 ->256 бит и т.д…

    • Для примера подойдет HS256

Могут возникнуть проблемы с масштабируемостью

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

Хотя существуют хорошо
зарекомендовавшие себя способы управления масштабируемостью (например,
использование для хранения сеансов СУБД наподобие Redis), это все равно
добавляет сложности. По мере роста количества пользователей, могут возникнуть
проблемы с масштабированием и управлением сеансами.

Не подходит для api

Если вы создаете API для предоставления услуг клиентам, cookie – это не лучший вариант. Если клиент не является браузером, это усложнит работу.

Например, если вы
разрабатываете мобильное приложение, наличие файлов cookie усложнит управление
файлами по сравнению с токеном.

Обычно работают в одном домене

Файлы cookie работают только в одном домене, если вы специально их не настроили.

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

Если ваш фронтенд
и бэкенд лежат в разных доменах или поддоменах, необходимо явно указать это
в файле cookie в белом списке. В противном случае браузер не отправит куки вместе
с запросом.

Передача токенов

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

Использование Jwts.parser Builder() для анализа токена в объект Jws, где вы можете получить любые утверждения, которые вы вложили в токен. Вы знаете, что они есть, потому что JWT неизменяемы, и если кто-то подделал токен, синтаксический анализ завершится неудачей с исключением недействительной подписи.

Подходит для хранения дополнительных данных

Поскольку этот подход поддерживает отдельные сессии для каждого пользователя, мы можем хранить прикрепленные к ним данные.

С помощью файлов cookie и
сессий можно хранить дополнительные данные персонализации, контроля доступа и сами сессии – это позволяет использовать их
для последующих запросов.

Все эти манипуляции можно провести и с помощью токенов. Например, токены JWT позволяют хранить Claim-объекты. Поскольку это увеличит размер токена, сохранение большего их количества повлияет на нагрузку сети.

Это не имеет смысла, если
речь идет об одном запросе, но преимущества становятся заметны, когда все
агрегируется и масштабируется.

Проблемы безопасности

Хотя введением токенов
пытаются решить проблемы безопасности аутентификации на основе cookies, полностью от них не избавиться.

Сохраненные в браузере токены могут быть уязвимы для атак XSS, если приложение позволяет внедрять внешние сценарии JavaScript.

Токен не имеет состояния и если он установлен снаружи, то его невозможно отозвать
до истечения срока жизни. Поэтому важно, чтобы он имел минимальный срок
годности.

Это stateless-механизм

В отличие от cookie-подхода, вариант с токенами не имеет состояния. Это означает, что он не сохраняет никакой
информации о пользователях в базе данных или на сервере. Сервер отвечает только за
создание и проверку токенов, что позволяет реализовывать более масштабируемые
решения.

Это полностью автоматизированный процесс

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

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

Кроме того, при CSRF-атаке
злодеи могут воспользоваться этим механизмом, чтобы заставить браузер отправить запросы с cookie на мошеннические сайты.

Заключение

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

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

Спасибо за внимание!

***

Дополнительные материалы:

Похожее:  Настройка компьютера для работы с КЭП (Windows) - УЦ АЙТИКОМ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *