Какие символы разрешены в токене доступа OAuth2? - PullRequest
0 голосов
/ 26 апреля 2018

RFC6749 и RFC6750 , похоже, не согласны друг с другом относительно того, какие символы разрешены в маркере доступа OAuth2.

Раздел A.12 из RFC6749 (оригинальная спецификация OAuth2) определяет формат токена доступа следующим образом:

A.12.Синтаксис «access_token»

Элемент «access_token» определен в разделах 4.2.2 и 5.1:

access-token = 1*VSCHAR 

В формате ABNF , VSCHAR означает:

VSCHAR =% x20-7E

(Это в основном все печатные символы ASCII )

Однако в RFC6750 (который имеет дело с использованием токенов носителя OAuth2) Раздел 2.1 , кажется, устанавливает более строгое подмножество разрешенных символов для токенов доступа.

Синтаксис для учетных данных носителя является следующим:

b64token    = 1*( ALPHA / DIGIT /
                   "-" / "." / "_" / "~" / "+" / "/" ) *"="
credentials = "Bearer" 1*SP b64token

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

Мои вопросы:

1) Какой из этих документов контролируется?Имеет ли RFC6750 приоритет, потому что он более ограничительный?

2) С точки зрения реальных реализаций «в дикой природе», маркеры доступа всегда ограничены кодировкой RFC6750?

3) Бонусный вопрос:Кто-нибудь знает, , почему эти две спецификации, опубликованные в одном и том же месяце по таким тесно связанным темам, не согласны с форматом маркера доступа?

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

TLDR: После заголовка авторизации Базовая схема, определенная в RFC2617 .Таким образом, токен должен быть закодирован в base64.

Это подчеркивается следующей фразой rfc6750,

Синтаксис поля заголовка «Авторизация» для этой схемы следует за использованиемБазовая схема, определенная в разделе 2 [RFC2617]

Если вы идете и проверяете RFC2617 , ниже приведена ABNF, которая выполняет кодирование base64 для учетных данных пользователя.

credentials = "Basic" basic-credentials

basic-credentials = base64-user-pass

Но, как указал OP, ABNF определяется как b64token, которыйэто позволяет больше, чем base64 кодирование.Таким образом, в реальных реализациях мы можем видеть, например, JWT (ABNF с разделением base64 и .), используемые в качестве токенов на предъявителя.Это допустимо, так как находится в пределах b64token ABNF.

Ответы на вопросы OP,

  1. Маркер доступа может иметь любой символ из диапазона %x20-7E.Никаких ограничений на это нет, и это определение токена доступа.
  2. Если токен доступа является токеном-носителем (token_type = bearer), то он должен следовать b64token AKA token68.Это делает маркер доступа квалифицированным для помещения в заголовок авторизации .
  3. RFC6749 определяет формат токена доступа.RFC6750 определяет, как использовать заголовок авторизации для передачи токена доступа.

b64token vs token68

Кажется, существует некоторая путаница в именовании b64token.

После некоторого поиска я наткнулся на следующие обсуждения IETF на RFC7235 .RFC7235 определяет текущий стандарт для аутентификации HTTP (который также включает Authorizationheader)

В соответствии с этими обсуждениями, b64token является специфической кодировкой.И были предложения переименовать b64token в token68.Они внесли это изменение и в основном b64token относится к token68.

В разделе приложения объясняется token68 в заголовке HTTP-авторизации (ПРИМЕЧАНИЕ. - Они извлечены. Перейти к ссылке напроверьте полное объяснение ABNF)

Авторизация = учетные данные

учетные данные = auth-схема [1 * SP (token68 / [("," / auth-param) * (OWS "), "[OWS auth-param])])]

token68 = 1 * (ALPHA / DIGIT /" - "/". "/" _ "/" ~ "/" + "/"/") * "="

Итак, как я вижу, RFC6750 не обновляется с этими именами (эти определения находились в процессе разработки на момент написанияэто).

0 голосов
/ 21 июня 2019

TL; DR: Между стандартами нет противоречий.Токены доступа OAuth могут обычно содержать любой печатный символ ASCII, но , если токен доступа является токеном носителя, он должен использовать синтаксис «token64», чтобы быть совместимым с HTTP / 1.1.

RFC 6749, §1.4 говорит нам: «Маркер доступа является строкой» и «обычно непрозрачен для клиента». §A.12 определяет его как один или несколько печатаемых символов ASCII ([ -~]+ в терминах регулярных выражений).

RFC 6749 определяет различные методы для получения токена доступа, но не заботится о том, как на самом деле использовать токен доступа, кроме как сказать, что вы "представляете его" серверу ресурсов, который должен проверить, а затем принять или отклонить его.

Но RFC 6749 требует, чтобы сервер авторизации сообщал клиенту тип токена (другая строка), который клиент может использовать для определения , как используется токен доступа.

Строка типа токена - это либо имя типа, зарегистрированное IANA (например, Bearer или mac), либо URL-адрес поставщика (например, http://oauth.example.org/v1), хотя URL-адрес простоудобный идентификатор пространства имен и не должен разрешаться ни к чему.

В большинстве развертываний тип токена будет Bearer, семантика которого определена в RFC 6750.

RFC6750 определяет три метода (§§2.1–2.3) представления токена доступа Bearer серверу ресурсов. рекомендуемый метод (который серверы ресурсов должны поддерживать, чтобы быть совместимым со стандартами) должен отправлять его в заголовке авторизации HTTP ( §2.1 ), в этом случаетокен должен быть "b64token" ([-a-zA-Z0-9._~+/]+=* в терминах регулярных выражений).

Это соответствует тому, что спецификация HTTP / 1.1 называет "token68" ( RFC 7235 §2.1 ), и являетсянеобходимо разрешить использование токена без кавычек в заголовке HTTP-авторизации.(Что касается того, почему HTTP / 1.1 допускает эти точные символы, то это связано с историческими причинами, связанными со стандартами HTTP / 1.0 и базовой аутентификацией, а также с ограничениями в текущих и исторических реализациях HTTP. Сетевые протоколы - грязное дело.)

"b64token" ( aka"token68") разрешает подмножество символов ASCII, обычно используемых с кодировкой base64, но (несмотря на имя) токен Bearer не навязывает семантику base64.Это просто непрозрачная строка, которую клиент получает с одного сервера и передает на другой.Реализации могут назначать ему семантику (например, JWT ), но это выходит за рамки стандартов токенов OAuth или Bearer.

RFC 6750 не утверждает, что токен доступа Bearer должен быть токеном b64, если используетсяс другими двумя (не рекомендуемыми) методами, но, учитывая, что клиент должен иметь возможность выбирать метод, было бы бессмысленно давать ему токен не-b64token.

Другие типы токенов OAuthможет не полагаться на то, что передается без кавычек в заголовке HTTP (или они вообще не могут использовать HTTP), и поэтому могут свободно использовать любой печатный символ ASCII.Это может быть полезно, например, для типов токенов, которые не непрозрачны для клиента;Например, в настоящее время я имею дело с настройкой, в которой ответ токена доступа выглядит примерно так:

{
  "access_token": "{\"endpoint\": \"srv8.example.org\", \"session_id\": \"fafc2fd\"}",
  "token_type": "http://vendor.example.org/",
  "expires_in": 3600,
  "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA"
}

Здесь токен доступа представляет собой JSON-кодированную структуру данных, которую клиент должендействовать (в соответствии с правилами, связанными с типом токена поставщика) для доступа к защищенному ресурсу.

0 голосов
/ 26 апреля 2018

Ну, я не специалист, но по своему опыту работы могу сказать, что вы всегда должны пытаться использовать RFC6750;технически заявляет об использовании кодированной строки base64.Почему? Хорошо, поскольку большинство запросов, в которых вы собираетесь использовать метод OAuth, предлагают использовать HTTP-заголовок авторизации, а в кодировке base64 используются безопасные символы ASCII, это гарантирует, что ваш HTTP-запрос будет читаем (почти) во всехсервера.Base64 также легче анализировать, и его также безопасно использовать в спецификации JSON.

Это, скорее всего, ответит на ваш вопрос 2.

EDIT

хорошо, на основепредоставленные вами ссылки, вот их рефераты:

RFC6749

Среда авторизации OAuth 2.0 позволяет стороннему приложению
получить ограниченный доступв службу HTTP, либо
от имени владельца ресурса, организовав взаимодействие утверждения 10101 * между владельцем ресурса и службой HTTP, либо разрешив стороннему приложению
получать доступ от своего имени,Эта спецификация
заменяет и устаревает протокол OAuth 1.0, описанный в RFC 5849.

RFC6750

В этой спецификации описывается использование токенов носителяв HTTP
запросы на доступ к защищенным ресурсам OAuth 2.0.Любая сторона, владеющая
токеном-носителем («носителем»), может использовать его для получения доступа к связанным ресурсам (без демонстрации владения
криптографическим ключом).Во избежание неправомерного использования токены на предъявителя должны быть
защищены от раскрытия при хранении и на транспорте.

В соответствии с их краткими описаниями каждой спецификации ясно, когда следует использовать один или другой.В двух словах, используйте RFC6749 , когда вы собираетесь предоставить ограниченный доступ к веб-службе, а затем запросите токен аутентификации.И используйте RFC6750 , когда вы собираетесь запросить токен на предъявителя в своем веб-сервисе.Токены на предъявителя всегда должны указываться в заголовке Authentication HTTP-запроса, а строки Base64 безопасны для передачи непосредственно как часть запроса.

...