Я пытаюсь создать поток входа / регистрации и сброса пароля с помощью библиотеки MSAL (1.1.7) на iOS.
Для политики B2C_1A_SignUpSignIn
вроде все работает нормально. Токены принимаются после обращения к браузеру и обратно.
Когда пользователь запрашивает сброс, нажав «Забыли пароль» в веб-просмотре: я поймаю код ошибки AADB2C90118
в соответствии с документами и запускаю новый поток с центром, у которого есть политика B2C_1A_PasswordReset
.
let authority = try MSALB2CAuthority(url: authURL)
let config = MSALPublicClientApplicationConfig(clientId: AuthCredential.clientID.description,
redirectUri: AuthCredential.redirectUri.description,
authority: authority)
config.knownAuthorities = [authority]
let application = try MSALPublicClientApplication(configuration: config)
return application
Все в порядке, поток сброса, запускается, может быть завершен и приводит к accessToken и refreshToken.
Теперь возникает проблема. Эти недавно приобретенные токены действительны только для политики B2C_1A_PasswordReset
, и когда я получаю токены незаметно для использования против нашего API, это происходит с политикой B2C_1A_SignUpSignIn
. Это означает, что при первой попытке выполнить запрос, включающий вызов MSAL.getTokenSilently
, я получаю следующую ошибку:
MSALErrorDescriptionKey=User interaction is required,
MSALOAuthErrorKey=invalid_grant,
NSUnderlyingError=0x6000018a5590 {
UserInfo = { MSALErrorDescriptionKey=AADB2C90088: The provided grant has not been issued for this endpoint.
Actual Value : B2C_1A_SignUpSignIn and Expected Value : B2C_1A_PasswordReset,
MSALOAuthErrorKey=invalid_grant,
MSALInternalErrorCodeKey=-42004
}
}
Ошибка кажется довольно очевидной, если я правильно понимаю, по крайней мере, нет пользователя, только accessToken и refreshToken, связанные с политикой B2C_1A_PasswordReset
. И требуется ручной вход пользователя.
Могу ли я сейчас запустить процесс входа пользователя вручную?
В этом случае поток забытых паролей iOS был бы почти глупым:
- Коснитесь учетной записи (запросить токен в интерактивном режиме с политикой
B2C_1A_SignUpSignIn
) - Подсказка iOS, позволяющая открыть веб-просмотр в сафари
- пользователи нажимают забытый пароль в веб-просмотре
- перенаправлен обратно в приложение, которое обнаруживает код ошибки (
AADB2C90118
) - запустить токен в интерактивном режиме с политикой
B2C_1A_PasswordReset
- Подсказка iOS, позволяющая открыть веб-просмотр в сафари
- Пользователь перескакивает через все обручи для сброса пароля
- перенаправлен обратно в приложение с помощью accessToken и refreshToken (которые я не могу использовать ни для чего)
- запустить токен в интерактивном режиме с политикой
B2C_1A_SignUpSignIn
- Подсказка iOS, позволяющая открыть веб-просмотр в сафари
- пользователь входит в систему с новыми учетными данными
- перенаправлен обратно в приложение с помощью accessToken и refreshToken (которые я МОГУ использовать)
Android не выводит запрос на открытие браузера, и для моего коллеги, разрабатывающего этот поток, пользователь входит в систему после сброса пароля, и, похоже, вход в систему происходит успешно в фоновом режиме.
Мне не удалось найти пример процесса сброса пароля в документации для iOS. Есть примеры для других платформ.
Можно ли структурировать это иначе, чтобы улучшить поток?
У нас есть доступ к серверной части, что мы можем там сделать?