У меня есть:
- myApp (сервер 1)
- микросервис аутентификации пользователя + база данных пользователей (сервер 2)
микросервис аутентификации пользователя имеет REST API, с помощью которого я могу управлять пользователями (создавать / удалять пользователей, обновлять данные пользователей, получать список всех пользователей, проверять пароль пользователя и т. д. c.)
Теперь мне нужно реализовать авторизацию / аутентификация:
- между пользователем и myApp (для этого я собираюсь использовать обычные сеансы (файлы cookie, содержащие только идентификатор сеанса) и хранить данные сеанса в Redis)
- между myApp и микросервисом аутентификации пользователя (для этого я предполагаю, что мне нужно использовать какой-то ключ API / токен)
Приложение myApp не имеет прямого доступа к База данных пользователей, вся связь осуществляется только через микросервис аутентификации пользователя.
На прошлой неделе я много читал об авторизации / аутентификации в REST API, но до сих пор не могу понять , как создать а * 11 21 * система авторизации / аутентификации для пользователя -> myApp и myApp -> микросервис аутентификации пользователя .
Вот что я придумал с на данный момент.
Зарегистрироваться ( Диаграмма ):
- Пользователь регистрируется, отправляя имя пользователя / пароль / другие данные в myApp
- myApp отправляет имя пользователя / пароль / другие данные в микросервис аутентификации пользователя
- Микросервис аутентификации пользователя создает нового пользователя в базе данных пользователей
Войти ( Диаграмма ):
- Теперь пользователь подписывается, отправляя имя пользователя / пароль в myApp
- myApp отправляет имя пользователя / пароль в микросервис аутентификации пользователя, который проверяет имя пользователя / пароль
- Если имя пользователя и пароль верны, микрослужба аутентификации пользователя генерирует ключ API (случайную строку) и сохраняет его в базе данных пользователей, связывая этот ключ API с записью пользователя:
username | password | email | address | APIKEY
---------+----------+-------+---------+-----------
steve | n8Y5e... | ... | ... | D4ED43...
- Затем микросерви для аутентификации пользователя ce возвращает сохраненный ключ API (+ некоторую дополнительную информацию о пользователе, которому он принадлежит) myApp
- myApp создает новый сеанс, сохраняя его в Redis: генерирует идентификатор сеанса и сохраняет идентификатор сеанса + ключ API + другие данные сеанса в Redis:
sessionID: 9w72tv3MHZD...
session_data: {
"cookie": {
"originalMaxAge": ...,
"expires": ...,
"httpOnly":true,
"path": ...
},
"user": {
"authenticated": true,
"username":"steve",
"apiKey": D4ED43C0...,
"created": ...
}
}
expire: ...
- Наконец, сервер myApp отправляет ответ с кодом ie, содержащим идентификатор сеанса.
- Готово, пользователь вошел в систему.
При каждом последующем запросе ( Диаграмма ):
- Пользователь отправляет повара ie, содержащего идентификатор сеанса
- Сервер myApp сравнивает идентификатор сеанса с тот, который хранится в Redis.
- Если они совпадают, myApp снова просматривает данные сеанса, извлекает ключ API, связанный с идентификатором сеанса, и отправляет этот ключ API в микросервис аутентификации пользователя
- User- Микрослужба проверки подлинности ищет пользователя в базе данных пользователей по ключу API. Если предоставленный ключ API существует, это означает, что пользователь, связанный с этим ключом API, аутентифицирован.
- Микрослужба аутентификации пользователя предоставляет доступ, возвращая что-то вроде
{ authenticated: true, username: "steve" }
в myApp - myApp использует это ответ на предоставление / ограничение доступа к страницам / функциям приложения
Выйти ( Диаграмма ) (первые 4 шага в точности такие же, как в «По каждому последующий запрос »выше):
- Пользователь отправляет повар ie, содержащий идентификатор сеанса
- Сервер myApp сравнивает идентификатор сеанса с тем, который хранится в Redis.
- Если они совпадают, myApp снова просматривает данные сеанса, извлекает ключ API, связанный с идентификатором сеанса, и отправляет этот ключ API в микросервис аутентификации пользователя
- Микросервис аутентификации пользователя ищет пользователя в базе данных пользователей по ключу API . Если предоставленный ключ API существует, это означает, что пользователь, связанный с этим ключом API, аутентифицирован.
- Микрослужба аутентификации пользователя удаляет ключи API из базы данных пользователей и отвечает примерно
{ authenticated: false }
на myApp - myApp видит, что пользователь не аутентифицирован, и удаляет все данные сеанса из Redis.
- myApp также «удаляет» ie Cook, устанавливая дату истечения срока его действия в прошлом, и пользователь выходит из системы.
Вопрос: Я что делаю не так? Что мне изменить? Я никогда раньше не создавал аутентификацию для API, поэтому буду признателен за любые рекомендации. Я хочу понять «общую картину».