У меня есть API, который использует oAuth2, и мои собственные мобильные приложения, которые используют этот API в качестве своего бэкэнда. Поскольку пользователи могут входить в систему одновременно с нескольких устройств (например, iPhone, iPad, планшета Android или телефона Android), мне нужен API, чтобы различать каждое соединение. Я хотел бы сделать это через отдельные токены доступа: каждый клиент получает отдельный токен доступа.
Проблема в том, что текущая реализация, которую мы используем (spring-security-oauth2), генерирует уникальный ключ на основе client_id, username и scope. Таким образом, при получении токена доступа все клиенты получают одинаковый токен доступа для одного и того же пользователя. Это делается с помощью DefaultAuthenticationKeyGenerator.
Безопасно ли игнорировать генератор ключей аутентификации и просто создавать новый токен доступа при каждом запросе от клиента?
AuthenticationKeyGenerator
интерфейс. Не могли бы вы создать свою собственную реализацию и использовать ее вместо этого?Ответы:
Весеннее облако обеспечивает уже такое поведение. Просто добавьте разных клиентов. Как и iosAppClient, androidAppClient в вашем классе AuthorizationServerConfiguration.
В бэкэнде вы можете получить clientID, как показано ниже
и реализовать другое поведение на основе clientId.
источник
Один из ответов заключается в том, что каждая платформа приложения - это отдельный клиент, поэтому у него должен быть свой идентификатор клиента. Один для приложения iOS, один для веб-сайта и т. Д.
Что касается различия между iPad и iPhone, я бы предложил не полагаться на систему OAuth для этого.
источник
Я столкнулся с той же проблемой при разработке моего бэкенда с Spring Boot и OAuth2. Проблема, с которой я столкнулся, заключалась в том, что если несколько устройств совместно использовали одни и те же токены, то, как только одно устройство обновляло токен, другое устройство было бы невежественным, и, короче говоря, оба устройства входили в безумие обновления токена. Мое решение состояло в том, чтобы заменить стандартную
AuthenticationKeyGenerator
реализацию пользовательской реализацией, которая переопределяетDefaultAuthenticationKeyGenerator
и добавляет новый параметрclient_instance_id
в смесь генератора ключей. Мои мобильные клиенты затем отправляют этот параметр, который должен быть уникальным при установке приложений (iOS или Android). Это не специальное требование, так как большинство мобильных приложений уже отслеживают экземпляр приложения в той или иной форме.который вы затем вводите аналогичным образом:
HTTP-запрос будет выглядеть примерно так
Преимущество использования этого подхода состоит в том, что, если клиент не отправляет
client_instance_id
, будет создан ключ по умолчанию, и если предоставляется экземпляр, один и тот же ключ возвращается каждый раз для одного и того же экземпляра. Кроме того, ключ не зависит от платформы. Недостатком является то, что дайджест MD5 (используется внутри) вызывается два раза.источник