Использование сервера ресурсов Oauth2 (сервисы Google) и клиента Oauth2 в Spring Security6
Я хочу получить информацию о зарегистрированном пользователе приложения через приложение Google с использованием аутентификации JWT. Я пытаюсь использовать клиент OAuth2, чтобы получить информацию о пользователях, у которых есть групповая почта, зарегистрированная в созданном мной приложении Google. Я планирую использовать сервер ресурсов OAuth2 с Google для аутентификации, то есть для создания токенов и управления ими.
Правильно ли я использую метод работы, которую планирую выполнить?
Я применяю следующие методы по порядку.
- Использование сервера ресурсов OAuth2 для аутентификации пользователя. Это позволит аутентифицировать пользователя с помощью предоставленных клиентом учетных данных и получить JWT (веб-токен JSON).
- Используя сгенерированный JWT, я запрошу доступ к сервисам Google. Следуя этому пользовательскому потоку аутентификации JWT, я предоставляю токен доступа клиенту пользователя с разрешениями на доступ.
- Используя токен доступа, я получу информацию о пользователе, отправив запрос в userInfoEndpoint, предоставленный клиентом OAuth2. Я сохраню полученную информацию о пользователе в своей базе данных с помощью customOidcUserService.
1 ответ
Я думаю, вам стоит прочитать мои уроки.
Серверы ресурсов OAuth2 не аутентифицируют пользователей. Это делают только клиенты Oauth2.
Для аутентификации пользователя требуется некоторое состояние для хранения токенов. Когда клиент OAuth2 находится на сервере, для этого обычно используется сеанс => вам придется настроить приложение Spring как клиент OAuth2, если вы хотите, чтобы оно обрабатывало аутентификацию пользователя (и оно будет защищено с помощью сеансов, а не токенов доступа). ).
Запросы к серверам ресурсов должны быть авторизованы с помощью токена доступа. Как этот токен был приобретен (сauthorization-code
поток с участием «человека»-пользователя, сclient-credentials
поток для программного «пользователя», сrefresh-token
поток, когда это поддерживается и т. д.), не имеет отношения к серверу ресурсов. Для него имеет значение только то, был ли токен доступа выдан органом, которому он доверяет, действителен ли этот токен (аудитория, срок действия и т. д.) и должен ли он предоставлять доступ на основе утверждений (закодированных в токене или полученных из него). ).
Конечные точки информации о пользователе не предоставляются клиентам OAuth2. Он обслуживается серверами авторизации и используется клиентами (в качестве источника пользовательских данных, другим возможным источником являются токены идентификатора в случае сервера авторизации OpenID).
Google не обязательно будет генерировать токены доступа JWT. Генерируемые им токены доступа предназначены для использования службами Google, а формат токена представляет собой контракт между авторизацией и серверами ресурсов (Google). Этот формат, представляющий собой JWT или непрозрачный токен, должен быть прозрачным для клиентов OAuth2 (которые не должны пытаться интерпретировать токены доступа).
Если вы хотите защитить собственный сервер ресурсов, написанный с помощью Spring (REST API без сохранения состояния, защищенный токенами доступа), вам, вероятно, придется настроить промежуточный сервер авторизации с федерацией удостоверений от Google. Существует множество решений либо локально (Keycloak — самое известное и многофункциональное, но у Spring также есть платформа для создания собственной), либо облачные (Auth0, Amazon Cognito, Azure AD и многие другие). Большинство из них предоставляют функцию «Войти через Google» и выдают JWT (и позволяют делать полезные вещи, например управлять ролями пользователей).