Ссылка на обсуждение, предоставленная Catchdave, содержит еще одну действительную точку (оригинал, недействительная ссылка) , сделанную Диком Хардтом, которую, я считаю, стоит упомянуть здесь дополнительнона то, что было написано выше:
Я вспомнил токены обновления для безопасности и аннулирования.<...>
отзыв: если токен доступа самодостаточен, авторизацию можно отменить, не выдавая новые токены доступа.Ресурсу не нужно запрашивать сервер авторизации, чтобы узнать, является ли токен доступа действительным. Это упрощает проверку токена доступа и упрощает масштабирование и поддержку нескольких серверов авторизации.Существует окно времени, когда токен доступа действителен, но авторизация отменена.
Действительно, в ситуации, когда сервер ресурсов и сервер авторизации являются одним и тем же объектом, и когда соединение между пользователем и любым из них (как правило) одинаково безопасно, нет особого смысла сохранять обновлениетокен, отдельный от токена доступа.
Хотя, как уже упоминалось в цитате, еще одна роль токенов обновления заключается в том, чтобы гарантировать, что токен доступа может быть отозван пользователем в любое время (через веб-интерфейс в его профилях).Например, при одновременном сохранении масштабируемости системы.
Обычно токены могут быть либо случайными идентификаторами, указывающими на конкретную запись в базе данных Сервера, либо содержать в себе всю информацию (конечно, этоинформация должна быть подписана, например, MAC .
Как должна работать система с долгоживущими токенами доступа
Серверпозволяет Клиенту получить доступ к данным Пользователя в рамках заранее определенного набора областей путем выдачи токена.Поскольку мы хотим сохранить токен отзывным, мы должны сохранить в базе данных токен вместе с установленным или снятым флагом «отзывано» (в противном случае, как бы вы сделали это с автономным токеном?) База данных может содержать до len(users) x len(registered clients) x len(scopes combination)
записей.Затем каждый запрос API должен попадать в базу данных.Хотя запросы к такой базе данных, выполняющие O (1), довольно тривиальны, сама точка отказа может отрицательно повлиять на масштабируемость и производительность системы.
Как система с длительным сроком службыдолжен работать токен оперативного обновления и токен недолговечного доступа
Здесь мы выдаем два ключа: токен случайного обновления с соответствующей записью в базе данных и подписанный токен автономного доступа, содержащий среди прочего срок действияполе timestamp.
Поскольку токен доступа самодостаточен, нам вообще не нужно обращаться к базе данных, чтобы проверить ее действительность.Все, что нам нужно сделать, это декодировать токен и проверить подпись и отметку времени.
Тем не менее, нам все еще нужно хранить базу данных токенов обновления, но количество запросов к этой базе данных обычно определяетсясрок жизни токена доступа (чем дольше срок жизни, тем ниже скорость доступа).
Чтобы отозвать доступ Клиента у конкретного пользователя, мы должны пометить соответствующий токен обновления как «отозванный» (или удалите его полностью) и прекратите выпуск новых токенов доступа.Очевидно, что есть окно, в течение которого токен обновления был отозван, но его токен доступа все еще может быть действительным.
Компромиссы
Маркеры обновления частично устраняютSPoF (единичная точка отказа) базы данных Access Token, однако они имеют некоторые очевидные недостатки.
«Окно».Промежуток времени между событиями «пользователь отменяет доступ» и «доступ гарантированно будет отменен».
Усложнение клиентской логики.
без обновить токен
- отправить API-запрос с токеном доступа
- , если токен доступа недействителен, выполнить ошибку и попросить пользователя повторно пройти аутентификацию
с токеном обновления
- отправить запрос API с токеном
- Если токен доступа недействителен, попробуйте обновить его, используя токен обновления
- если запрос на обновление пройден, обновите токен доступа и повторно отправьте первоначальный запрос API
- Если запрос на обновление завершится неудачно, попросите пользователя повторно пройти аутентификацию
Я надеюсь, что этот ответ имеет смысл и помогает кому-то принять более продуманное решение. Хочу также отметить, что некоторые известные провайдеры OAuth2, включая github и foursquare, используют протокол без маркеров обновления и, похоже, довольны этим.