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