У меня есть сервер Keycloak (K C), который недоступен из inte rnet. Все операции (создание пользователя, вход в систему, выход из системы, смена пароля) поддерживаются веб-интерфейсом пользователя (Angular app) и приложениями бэкэнда (Spring Boot). Бэкэнд-приложение создается как confidential
клиент и использует API REST K C Admin для создания и управления пользователями.
С этой конфигурацией я бы хотел позволить пользователю сменить свой пароль, но я застрял! Как быть уверенным, что пользователь, запрашивающий изменение пароля, - это тот же пользователь, который отправляет новый пароль?
Поток смены пароля:
a. Пользователь просит изменить пароль, отправив его / ее адрес электронной почты
b. Он / она получает электронное письмо со ссылкой, содержащей токен (этот токен может использоваться только один раз)
c. После нажатия на ссылку он / она перенаправляется на форму для заполнения нового пароля.
d. После размещения сообщения новый пароль, приложение бэкэнда отправляет его на K C.
Я застрял на последнем шаге. Я хотел бы защитить конечную точку, принимающую новый пароль, чтобы быть уверенным, что только пользователь в потоке смены пароля может POST-данные.
Моей первой идеей было запросить временный токен доступа у K C, используя пользователя username и учетные данные бэкэнд-приложения, этот токен будет содержать специальную роль (скажем, ROLE_CHANGE_PASSWORD ), а затем отправить обратно этот токен доступа при перенаправлении пользователя в форму нового пароля (шаг c. ); поэтому, когда вы размещаете новый пароль, мы также аутентифицируемся одновременно с этим временным токеном, содержащим подходящую роль для доступа к конечной точке.
Проблема в следующем:
- Как бэкэнд-приложение может запросить токен доступа, содержащий имя пользователя, не зная пароля пользователя? Я не хочу использовать
offline_access
по многим причинам.
У вас есть лучшее решение для решения этой проблемы?
Большое спасибо