Keycloak: Как идентифицировать пользователя при смене пароля с помощью API REST admin? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть сервер 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 по многим причинам.

У вас есть лучшее решение для решения этой проблемы?

Большое спасибо

...