Насколько безопасен токен доступа? - PullRequest
1 голос
/ 29 апреля 2020

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

Этот же токен также хранится в API, и когда клиент пытается получить к нему доступ с помощью токена доступа, выданного сервером аутентификации, API проверяет, содержит ли он его? Если это так, значит ли это, что токен доступа отправляется как клиенту, так и защищенному API в процессе аутентификации?

Надеюсь, я хорошо объяснил мою проблему. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Anunay привел довольно хорошую аналогию того, как JWT работают на высоком уровне в качестве переносимого, надежного идентификатора, но поскольку OAuth поддерживает больше, чем просто аутентификацию JWT, он может потребовать обмена чуть более подробной информацией.

Самоанализ токена

В своем вопросе вы справедливо предположили, что токенам нужен какой-то способ доверия, и что одним из таких способов было бы сохранить токен в частной базе данных и выполнять поиск при каждом представлении токена для определения его действительности. Вы абсолютно точно сможете оборудовать действительный сервер OAuth, используя такой метод, выполнив токен, используя любую форму, которую вы наберете sh, и напишите конечную точку introspection , которая выполняет поиск. OAuth spe c является преднамеренно абстрактным, поэтому функциональное поведение интроспекции токенов может принимать различные формы.

Одна из причин такого уровня абстракции заключается в том, что при сохранении токенов для прямого поиска может быть easy , это означает, что вы должны хранить копии этих токенов в какой-либо форме в частной базе данных для сравнения. Это хранилище, в свою очередь, сделает вас приманкой для плохих актеров, как внутренних, так и внешних, которые будут стремиться выдавать себя за ваших пользователей в массовом порядке. Именно по этой причине многие реализации OAuth предпочитают выдавать и проверять токены, используя шифрование с открытым / закрытым ключом вместо прямого поиска. Этот процесс очень похож на тот, который Аннуай описал в своем комментарии, так как он выдает токены, которые подписаны закрытым ключом и проверены публичным c. Благодаря этому процессу вам больше не нужно хранить все токены в частной базе данных, а вместо этого просто нужно защитить закрытые и публичные ключи c, которые используются для подписи и проверки токенов соответственно.

JSON Веб-токены (JWT) и сокращение количества вызовов самоанализа

Ответ Аннуэя специально относится к общей структуре токенов, которая генерируется с использованием шифрования с открытым / закрытым ключом и выдается пользователям JSON Веб-токены. Эти токены структурированы таким образом, что они включают пользовательскую информацию, которая может понадобиться бэкэнд-службе, такую ​​как идентификатор пользователя, адрес электронной почты и иногда больше, в необработанном формате, который непосредственно читается бэкэнд-API. В дополнение к этой необработанной информации, JWT включают в себя дубликат копии данных, но этот дубликат копируется с помощью закрытого ключа. Чтобы доверять токену JWT, все, что вам нужно сделать, - это использовать ключ publi c и убедиться, что кодированная полезная нагрузка с закрытым ключом проверяется путем применения ключа publi c к необработанной полезной нагрузке. Поскольку ключи publi c редко меняются, многие серверные службы кэшируют ключи, используемые для проверки, и предпочитают не выполнять самоконтроль токена на сервере-эмитенте, поскольку они уже могут проверить полезную нагрузку. Таким образом вы оптимизируете пропускную способность для внутренних служб, защищенных с помощью OAuth.

Поскольку ключи publi c могут использоваться только для проверки полезных нагрузок, а не для их создания, эти ключи publi c часто передаются в широковещательном режиме. серверами, которые выпустили токены, позволяющие кому-либо «доверять» токенам, которые он выпускает, если они того пожелают. Чтобы узнать больше об этом процессе, я бы порекомендовал вам изучить OpenID Connect .

1 голос
/ 29 апреля 2020

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

Теперь для маркера доступа, очень просто, сервер авторизации проверяет пользователя. После проверки он выдает пользователю токен JWT (токен доступа). Этот токен подписан закрытым ключом. Он содержит ваши данные и закодирован вместе с подписью. Теперь вы можете передать этот токен любому третьему лицу, у которого есть ключ publi c, и доверять серверу авторизации. Теперь, когда вы делитесь токеном доступа с этой третьей стороной, он использует ключ publi c для проверки токена и проверки его срока действия. Если он действителен, он позволяет вам войти. Поэтому API на самом деле не нужно общаться с сервером аутентификации или хранить какие-либо подробности о токене. Все, что ему нужно - это ключ c для декодирования токена.

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

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

...