Сохранение токена обновления Spring OAuth2RestTemplate

У меня есть мобильное приложение, которое использует мой сервер Spring Boot для таких вещей, как аутентификация и доступ к данным. Часть приложения Spring Boot получает доступ к данным с сервера ресурсов, используя OAuth2. Я наткнулся на клиентскую библиотеку oauth2 для Spring, которая творит чудеса и все просто работает из коробки.

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

Я искал способы сохранить токен обновления для каждого пользователя в моей базе данных, но не нашел поддержки для этого в библиотеке. Это заставляет меня задаться вопросом, должен ли я реализовать это сам или есть ли в этом необходимость.

Любой совет приветствуется!


person RDNotorious    schedule 14.10.2019    source источник


Ответы (1)


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


В вашем случае сначала, когда вы нажимаете "/oauth/token" (конечная точка по умолчанию) вместе с секретом клиента и идентификатором клиента и остальными учетными данными пользователя, алгоритм проверяет данные пользователя в БД и соответствует секрету и идентификатору, представленным в заголовке запроса. Если все пойдет хорошо, он сгенерирует тип носителя — токен доступа и обновления и будет хранить эти токены в разных коллекциях в базе данных. . Вы можете использовать MongoTokenStore, если вы используете MongoDb для хранения и доступа к сохраненным токенам.

Далее вам необходимо настроить WebSecurity/AuthorizationServer/ResourceServer для проверки токенов конечных точек и токенов заголовков, аутентификации и авторизации пользователей и предоставления действительных токенов доступа к ресурсу соответственно.

Наконец, когда у вас есть действительный токен доступа и вы попадаете в API с правильным запросом заголовка, сервер предоставляет вам разрешение на доступ к ресурсу!

Это базовая функциональность OAuth2.0.

Обычно токены доступа имеют более короткое время жизни, в то время как токены обновления имеют сравнительно большее время жизни. После истечения срока действия токена доступа новый токен доступа может быть сгенерирован с использованием токенов обновления. Если срок действия токенов обновления истек, вам нужно снова нажать API «/oauth/token», завершить цикл потока и снова сгенерировать токены. После истечения срока действия, когда вы нажимаете API с существующим токеном доступа, они удалены из коллекции. Это стандартная архитектура этого механизма, в остальном вы можете создавать собственные классы и изменять их функциональность в соответствии с вашими потребностями! Эта архитектура достаточно безопасна и является хорошей практикой.

Скриншот блок-схемы

Проверьте это сообщение на digitalocean.

Правки ----

  1. Лично я использовал MongoDB, где сделал две коллекции — AuthAccessTokens и AuthRefreshTokens, а именно там, где хранились эти две. Объект Access Token имеет идентификатор связанного RefreshToken, который помогает сопоставить их вместе. Остальное пользовательская дополнительная информация. также можно добавить с помощью TokenEnhancer. Поэтому токены всегда будут присутствовать в БД, если не истек срок их действия. И с точки зрения непрофессионала, если вы просто сосредоточены на бэкенде, вы всегда можете проверить свои токены доступа, нажав «/oauth/token» с правильными учетными данными пользователя, и он вернет назначенный токен, извлекая его из БД, иначе, если вы разрабатываете полный стек после создания токенов на первом этапе, просто сохраните их на стороне клиента либо в локальном хранилище браузера, либо в приложении. И если вы хотите намеренно завершить сеанс, например, в Logout, просто удалите эти токены из соответствующих коллекций.
person Naman    schedule 14.10.2019
comment
Но если я использую свое приложение Spring в качестве клиента для совершения защищенных вызовов OAuth2 от имени моих пользователей, нужно ли мне сохранять их токены обновления в моей собственной базе данных? Потому что что произойдет, если срок действия сеанса истечет, а токен обновления будет потерян. Вызывается ли конечная точка oauth/token для новых токенов? Разве для этого не нужен код авторизации? - person RDNotorious; 14.10.2019
comment
Я хочу сохранить токен обновления в своей базе данных для каждого пользователя, который запрашивает его данные. Мое приложение Spring является клиентом. Я обнаружил, что мне нужно реализовать bean-компонент JdbcClientTokenServices, который делает это за меня. Спасибо за вашу помощь - person RDNotorious; 14.10.2019