Проверяет ли пользователь OAuth токен-носитель с поставщиком OAuth по каждому запросу

Чтобы узнать больше о OAuth, я пытаюсь написать поставщика OAuth 2.0, а также потребителя.

Я как бы использую Doorkeeper Gem в качестве ссылки для своего провайдера, но я бы хотел написать свой собственный.

Мой вопрос касается последней пули в разделе 1.3 спецификации о токенах-носителях.

(F) Сервер ресурсов проверяет токен доступа и, если он действителен, выполняет запрос.

В этом случае The resource server validates the access token означающий, что он:

  • проверяет токен доступа на свою локально сохраненную копию токена доступа и его истечение
  • делает запрос к серверу провайдера, который возвращает ответ действительный/недействительный?
  • делает что-то еще полностью
+1
источник поделиться
1 ответ

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

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

Как указывает спецификация OAuth 2.0 (RFC 6749):

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

Они могут присутствовать на одном веб-сайте. Возможно, это два разных веб-сайта, но они оба имеют соединение с одной и той же базой данных. Затем сервер ресурсов может искать токен в базе данных, как и сервер авторизации.

Если сервер ресурсов не может прочитать базу данных сервера авторизации, он должен поговорить с сервером авторизации (и даже если это возможно, вероятно, было бы неплохо не напрямую читать базу данных).

Как именно вы устанавливаете и защищаете это общение, но запрос HTTPS REST имеет большой смысл. Многие реализации имеют разные механизмы. Для примера см. Проверка маркеров ресурсов ресурсов OAuth-2.0 в распределенной среде.

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

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

  • Если сервер авторизации отвечает очень быстро, серверу ресурсов может не понадобиться кэшировать ответ. На самом деле плохо спроектированный кеш может быть медленнее кэширования.
  • Необходимость разработки и реализации кэша с хорошей политикой кэширования может быть запретительной для реализации хорошего кэша на сервере ресурсов.
  • В зависимости от характера и масштаба ресурсного сервера стоимость выделения ОЗУ или хранения на диске в кеш может быть запретительной для реализации хорошего кеша на сервере ресурсов. Это особенно актуально, когда количество токенов доступа там очень велико, и для получения разумного коэффициента хита кэша требуется много памяти.
  • Готово ли сервер ресурсов принять токен доступа, даже если он был отозван на сервере авторизации?

Этот последний пункт заслуживает дальнейшего объяснения. На сервере авторизации обычно есть несколько механизмов для отмены токенов. Если владелец ресурса аннулирует авторизацию через пользовательский интерфейс, сервер авторизации должен аннулировать все токены, полученные с помощью этой авторизации (токены доступа и токены обновления). Сервер ресурсов также может использовать конечную точку отзыва токена (часто используется для механизма "выхода из системы" в публичных клиентах, которые используют неявное предоставление).

Готов ли сервер ресурсов рисковать принять токен, даже после его отмены? И если да, то как долго? Если это так, то он может кэшировать токен, иначе он не сможет. На первый взгляд, вы, разумеется, сказали бы, что сервер ресурсов НЕ ДОЛЖЕН использовать ответы на проверку кэшированных токенов. Но в некоторых случаях могут быть преимущества производительности, которые перевешивают риск. Это, очевидно, также зависит от характера ресурсов, хранящихся на сервере ресурсов, и от реальных рисков, связанных с ними.

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

+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос