Требуется ли проверка идентификаторов OpenID Connect id_token и access_token, если они получены веб-сервером?

Мне интересно, есть ли в потоке кода аутентификации OpenID Connect необходимость в проверке access_token и id_token, если они получены через мой веб-сервер, а не через браузер (т.е. используя задний канал, а не передний канал)?

Под потоком кода аутентификации я имею в виду поток, в котором браузер получает только код авторизации от сервера авторизации (то есть без access_token, без id_token) и отправляет код авторизации на мой веб-сервер. Таким образом, мой веб-сервер может напрямую взаимодействовать с сервером авторизации, представляя код аутентификации и обменивать его на access_token и id_token. Похоже, я могу просто декодировать access_token и id_token, чтобы получить нужную мне информацию (в основном просто идентификатор пользователя и т. Д.)

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

Но что, если access_token не передается ни по одному незащищенному каналу? В потоке кода аутентификации веб-сервер напрямую получает access_token с сервера аутентификации, и этот токен никогда не будет отправлен в браузер. Мне все еще нужно проверять токен? Каковы потенциальные риски, если я пропущу валидацию в таких потоках?


person Xinchao    schedule 27.08.2020    source источник


Ответы (1)


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

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

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

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

Таким образом, «человек посередине» практически невозможен. Однако в центрах обработки данных в бэкэнде вы иногда не используете HTTPS везде внутри компании. Часто TLS завершается через прокси, вы можете узнать об этом здесь

Когда вы получаете ID-токен, вы обычно создаете на его основе сеанс пользователя. И да, поскольку токен пересылается по более безопасному обратному каналу, вы можете быть в безопасности с этим. Но до сих пор многие атаки происходят изнутри, и чтобы хорошо работать в соответствии со всеми передовыми практиками, вы должны проверить их, как подпись, так и утверждения внутри токена (срок действия, эмитент, аудитория ...).

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

Кроме того, это интересно учиться :-)

ps, это видео является хорошей отправной точкой.

person Tore Nestenius    schedule 28.08.2020
comment
Что меня особенно смущает, так это то, что если есть атака SSL-полосы / человек посередине, как я могу уверенно проверить свой токен? Чтобы проверить токен, мне нужно будет получить открытый ключ сервера, который должен быть получен с помощью другого запроса на получение. Если посередине есть человек, он может просто перехватить это сообщение и дать мне фальшивый ключ, который он использовал для подделки токена? - person Xinchao; 29.08.2020
comment
Спасибо. Между прочим, ваш ответ очень ценен, несмотря ни на что, и я его приму. Что я не могу понять, так это то, что - если использование HTTPS для получения открытого ключа с сервера аутентификации достаточно хорошо для того, чтобы открытый ключ считался аутентичным, почему тот же способ не считается достаточно подходящим для токенов? Access_token и id_token извлекаются напрямую с сервера аутентификации с использованием HTTPS. Если я могу доверять открытому ключу, я должен доверять и этим токенам? - person Xinchao; 30.08.2020
comment
обновил свой ответ, как это делает его приемлемым, ps, большинство библиотек для проверки для вас, поэтому мне интересно, почему вы не хотите проверять их и быть в безопасности? - person Tore Nestenius; 30.08.2020
comment
Как вы сказали, я все равно проверю их, чтобы они следовали конвенции, но я действительно хочу знать, что происходит за кулисами, а не слепо следовать конвенциям. Действительно, существуют библиотеки, которые утверждают, что справляются со всей сложностью для меня, но я немного скептически отношусь к тому, насколько надежны / универсально применимы эти библиотеки, т.е. все ли они выполняют один и тот же набор проверок одинаковым образом? Если да, они должны быть взаимозаменяемыми? Тогда какой из них я должен использовать? - person Xinchao; 30.08.2020
comment
Здесь есть сертифицированные библиотеки openid.net/developers/libraries, и в зависимости от платформы, которую вы используете, выбирайте активно поддерживаемые библиотеки с открытым исходным кодом. Я согласен с тем, что вам следует изучить пакеты, изучить и посмотреть, как они работают, потому что в библиотеках действительно есть ошибки. см. auth0.com/blog/ и insomniasec.com/blog/auth0-jwt-validation-bypass - person Tore Nestenius; 30.08.2020