Смена пароля OPAQUE, версия 1
Для смены пароля аккаунта нужны действующая аутентифицированная сессия API и новое доказательство знания текущего пароля по OPAQUE. API не получает ни один пароль открытым текстом. Протокол заменяет серверный файл OPAQUE и сохраняет прежние зашифрованные записи, ключ и конверт восстановления.
Протокол
Все маршруты требуют действующего токена доступа Bearer. Аккаунт определяется по полю sub токена. Выбрать другой аккаунт в теле запроса нельзя.
POST /v1/account/password-change/reauth/startпринимает запрос учётных данных OPAQUE в каноническом Base64URL и возвращает ID сессии входа и ответ OPAQUE. Серверное состояние зашифровано при хранении и истекает через три минуты.POST /v1/account/password-change/reauth/finishпринимает ID сессии и финальное сообщение клиента. Успешное доказательство даёт случайный 256-битный билет на смену пароля сроком на две минуты. База хранит только его SHA-256. Сессия привязана к назначению, поэтому обычный маршрут входа не может обменять её на обычную сессию.POST /v1/account/password-change/registration/startпринимает билет и запрос регистрации OPAQUE для нового пароля. Ответ регистрации выдаётся только по действующему билету для аутентифицированного аккаунта.POST /v1/account/password-change/finishпринимает билет и финальные данные регистрации. В одной транзакции PostgreSQL API погашает билет, заменяет файл пароля OPAQUE, погашает другие билеты, отзывает все семейства токенов обновления и удаляет незавершённые состояния входа. Ответ содержит новую пару токенов. Билет нельзя использовать повторно, в другом аккаунте или после истечения срока.
Маршруты безопасности аккаунта дополнительно ограничены десятью запросами в минуту на аккаунт. Недействительные и просроченные билеты дают общий отказ в авторизации. Неудачная проверка или регистрация оставляет прежние учётные данные в силе.
Обязанности клиента
- Хранить состояния OPAQUE, пароли, билеты, данные регистрации и токены в памяти только на время, требуемое протоколом. Исключить их из журналов.
- Проверить закреплённый ключ сервера через имеющийся клиент OPAQUE перед отправкой финального сообщения.
- Локально перешифровать ключ сейфа новым паролем и атомарно сохранить новый локальный конверт. Этот шаг отделён от обновления учётных данных API. Шифротекст ревизий остаётся прежним.
- Хранить полученный токен обновления только в записи привязки аккаунта в SQLCipher, а токен доступа — только в памяти. Заменить старый токен обновления после подтверждения сервера.
- Если билет истёк, уже использован или регистрация не удалась, повторно подтвердить текущий пароль. Если соединение оборвалось после фиксации транзакции, может потребоваться вход с новым паролем.
Для современных токенов доступа отзыв сессии действует сразу. Устаревшие JWT без sid могут работать до окончания 15-минутного срока. См. жизненный цикл сессий. API не сохраняет открытые пароли, билеты, данные регистрации и содержимое сейфа.