Руководство. Добавление регистрации в приложении iOS/macOS с помощью собственной проверки подлинности
Область применения: iOS (Swift) macOS (Swift) (Swift)
В этом руководстве показано, как зарегистрироваться пользователя с помощью однократного секретного кода или имени пользователя (электронной почты) и пароля, а также собирать атрибуты пользователей в приложении iOS/macOS с помощью собственной проверки подлинности.
- Зарегистрируйте пользователя с помощью однократного секретного кода электронной почты или имени пользователя (электронной почты) и пароля.
- Сбор атрибутов пользователей во время регистрации.
- Обработка ошибок регистрации.
Необходимые компоненты
- Руководство. Подготовка приложения iOS/macOS для собственной проверки подлинности.
- Если вы хотите собирать атрибуты пользователей во время регистрации, настройте атрибуты пользователя при создании потока регистрации и входа.
Регистрация пользователя
Чтобы зарегистрироваться у пользователя с помощью одноразового секретного кода или имени пользователя (электронной почты) и пароля, вы собираете сообщение электронной почты от пользователя, а затем отправляете сообщение электронной почты, содержащее одноразовый секретный код пользователю. Пользователь вводит допустимый секретный код электронной почты для проверки имени пользователя.
Чтобы зарегистрироваться у пользователя, необходимо выполнить следующие действия.
Создайте пользовательский интерфейс для:
- Сбор сообщения электронной почты от пользователя. Добавьте проверку в входные данные, чтобы убедиться, что пользователь вводит допустимый адрес электронной почты.
- Соберите пароль при регистрации с помощью имени пользователя (электронной почты) и пароля.
- Соберите одноразовый секретный код электронной почты от пользователя.
- При необходимости соберите атрибуты пользователя.
- Повторно отправьте одноразовый секретный код, если пользователь не получает его.
- Запустите поток регистрации.
В приложении добавьте кнопку, событие выбора которой активирует следующий фрагмент кода:
@IBAction func signUpPressed(_: Any) { guard let email = emailTextField.text else { resultTextView.text = "Email or password not set" return } nativeAuth.signUp(username: email, delegate: self) }
Для регистрации пользователя с помощью однократного секретного кода электронной почты мы используем метод библиотеки
signUp(username:delegate)
, который отвечает асинхронно путем вызова одного из методов в переданном объекте делегата, который должен реализоватьSignUpStartDelegate
протокол. Следующая строка кода инициирует процесс регистрации пользователя:nativeAuth.signUp(username: email, delegate: self)
В методе
signUp(username:delegate)
мы передаем адрес электронной почты пользователя из формы отправки и делегата (класс, реализующийSignUpStartDelegate
протокол).Чтобы зарегистрироваться пользователя с помощью электронной почты с паролем, используйте следующие фрагменты кода:
@IBAction func signUpPressed(_: Any) { guard let email = emailTextField.text, let password = passwordTextField.text else { resultTextView.text = "Email or password not set" return } nativeAuth.signUp(username: email,password: password,delegate: self) }
мы используем метод библиотеки
signUp(username:password:delegate)
, который отвечает асинхронно путем вызова одного из методов в переданном объекте делегата, который должен реализоватьSignUpStartDelegate
протокол. Следующая строка кода инициирует процесс регистрации пользователя:nativeAuth.signUp(username: email, password: password, delegate: self)
В методе
signUp(username:password:delegate)
мы передаем адрес электронной почты пользователя, пароль и делегат (класс, реализующийSignUpStartDelegate
протокол).Чтобы реализовать
SignUpStartDelegate
протокол в качестве расширения для нашего класса, используйте следующее:extension ViewController: SignUpStartDelegate { func onSignUpStartError(error: MSAL.SignUpStartError) { resultTextView.text = "Error signing up: \(error.errorDescription ?? "no description")" } func onSignUpCodeRequired( newState: MSAL.SignUpCodeRequiredState, sentTo: String, channelTargetType: MSAL.MSALNativeAuthChannelType, codeLength: Int ) { resultTextView.text = "Verification code sent to \(sentTo)" } }
Вызов или
signUp(username:delegate)
результат вызоваsignUp(username:password:delegate)
методов либоonSignUpCodeRequired()
onSignUpStartError()
делегирования. ВызываетсяonSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength)
, чтобы указать, что код отправлен для проверки адреса электронной почты пользователя. Наряду с некоторыми сведениями о том, где был отправлен код, и сколько цифр он содержит, этот метод делегата также имеетnewState
параметр типаSignUpCodeRequiredState
, который предоставляет нам доступ к двум новым методам:submitCode(code:delegate)
resendCode(delegate)
Чтобы отправить код, предоставленный пользователем, используйте следующую команду:
newState.submitCode(code: userSuppliedCode, delegate: self)
Чтобы реализовать
SignUpVerifyCodeDelegate
протокол в качестве расширения для нашего класса, используйте следующее:extension ViewController: SignUpVerifyCodeDelegate { func onSignUpVerifyCodeError(error: MSAL.VerifyCodeError, newState: MSAL.SignUpCodeRequiredState?) { resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")" } func onSignUpCompleted(newState: SignInAfterSignUpState) { resultTextView.text = "Signed up successfully!" } }
Принимает
submitCode(code:delegate)
параметр делегата, и мы должны реализовать необходимые методы в протоколеSignUpVerifyCodeDelegate
. В наиболее распространенном сценарии мы получаем вызов, указывающийonSignUpCompleted(newState)
, что пользователь был зарегистрирован и поток завершен.
Сбор атрибутов пользователя во время регистрации
Регистрировать пользователя с помощью однократного секретного кода или имени пользователя (электронной почты) и пароля можно собирать атрибуты пользователей перед созданием учетной записи пользователя. Метод signUp(username:attributes:delegate)
принимает атрибуты в качестве параметра.
Чтобы собрать атрибуты пользователя, используйте следующий фрагмент кода:
let attributes = [ "country": "United States", "city": "Redmond" ] nativeAuth.signUp(username: email, attributes: attributes, delegate: self)
ignUp(username:password:attributes:delegate)
ИлиsignUp(username:attributes:delegate)
приводит к вызову методов либоonSignUpCodeRequired()
onSignUpStartError()
делегата или вызовуonSignUpAttributesInvalid(attributeNames: [String])
, если он реализован в делегате.Чтобы реализовать
SignUpStartDelegate
протокол в качестве расширения для нашего класса, используйте следующий фрагмент кода:extension ViewController: SignUpStartDelegate { func onSignUpStartError(error: MSAL.SignUpStartError) { resultTextView.text = "Error signing up: \(error.errorDescription ?? "no description")" } func onSignUpCodeRequired( newState: MSAL.SignUpCodeRequiredState, sentTo: String, channelTargetType: MSAL.MSALNativeAuthChannelType, codeLength: Int ) { resultTextView.text = "Verification code sent to \(sentTo)" } func onSignUpAttributesInvalid(attributeNames: [String]) { resultTextView.text = "Invalid attributes \(attributeNames)" } }
Если атрибуты недопустимы, вызывается метод
onSignUpAttributesInvalid(attributeNames: [String])
. В этом случае мы отображаем список недопустимых атрибутов пользователю.onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength)
В противном случае вызывается, чтобы указать, что код отправлен для проверки адреса электронной почты пользователя. Помимо сведений, таких как получатель кода и число цифр кода, этот метод делегата имеетnewState
параметр типаSignUpCodeRequiredState
, который дает нам доступ к двум новым методам:submitCode(code:delegate)
resendCode(delegate)
Атрибуты пользователя на одной или нескольких страницах
Чтобы распределить атрибуты по одной или нескольким страницам, необходимо задать атрибуты, которые мы собираемся собирать на разных страницах как обязательные в конфигурации клиента идентификации и доступа (CIAM).
Мы вызываем signUp(username:password:delegate)
без передачи атрибутов. Следующим шагом будет вызов newState.submitCode(code: userSuppliedCode, delegate: self)
для проверки электронной почты пользователя.
Мы реализуем SignUpVerifyCodeDelegate
протокол как расширение для нашего класса, как и раньше, но на этот раз мы должны реализовать необязательный метод onSignUpAttributesRequired(attributes:newState)
в дополнение к необходимым методам:
extension ViewController: SignUpVerifyCodeDelegate {
func onSignUpAttributesRequired(newState: SignUpAttributesRequiredState) {
resultTextView.text = "Attributes required"
}
func onSignUpVerifyCodeError(error: MSAL.VerifyCodeError, newState: MSAL.SignUpCodeRequiredState?) {
resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")"
}
func onSignUpCompleted(newState: SignInAfterSignUpState) {
resultTextView.text = "Signed up successfully!"
}
}
Этот метод делегата имеет newState
параметр типа SignUpAttributesRequiredState
, который предоставляет нам доступ к новому методу:
submitAttributes(attributes:delegate)
Чтобы отправить атрибуты, предоставленные пользователем, используйте следующий фрагмент кода:
let attributes = [
"country": "United States",
"city": "Redmond"
]
newState.submitAttributes(attributes: attributes, delegate: self)
Мы также реализуем SignUpAttributesRequiredDelegate
протокол в качестве расширения для нашего класса:
extension ViewController: SignUpAttributesRequiredDelegate {
func onSignUpAttributesRequiredError(error: AttributesRequiredError) {
resultTextView.text = "Error submitting attributes: \(error.errorDescription ?? "no description")"
}
func onSignUpAttributesRequired(attributes: [MSALNativeAuthRequiredAttribute], newState: SignUpAttributesRequiredState) {
resultTextView.text = "Attributes required"
}
func onSignUpAttributesInvalid(attributeNames: [String], newState: SignUpAttributesRequiredState) {
resultTextView.text = "Attributes invalid"
}
func onSignUpCompleted(newState: SignInAfterSignUpState) {
resultTextView.text = "Signed up successfully!"
}
}
Если пользователь не предоставляет все необходимые атрибуты или недопустимые атрибуты, вызываются следующие методы делегата:
onSignUpAttributesInvalid
: указывает, что одна или несколько атрибутов, отправленных сбой проверки входных данных. Эта ошибка содержит параметр attributeNames, который представляет собой список всех атрибутов, отправленных разработчиком, которые не выполнили проверку входных данных.onSignUpAttributesRequired
: указывает, что серверу требуется отправить один или несколько атрибутов перед созданием учетной записи пользователя. Это происходит, когда один или несколько атрибутов задаются как обязательные в конфигурации клиента. Этот результат содержит параметр атрибутов, который представляет собой список объектов, которые содержат сведения о атрибутахMSALNativeAuthRequiredAttribute
пользователя, необходимых API.
Оба метода делегата содержат новую ссылку на состояние. Мы используем newState
параметр для повторного вызова submitAttributes(attributes:delegate)
с новыми атрибутами.
Обработка ошибок регистрации
Во время регистрации не все действия успешно выполнены. Например, пользователь может попытаться зарегистрироваться с помощью адреса электронной почты, который уже используется, или отправить недопустимый код.
В более ранней SignUpStartDelegate
реализации протокола мы просто отображали ошибку при обработке функции делегата onSignUpStartError(error)
.
Чтобы улучшить взаимодействие с пользователем, управляя определенным типом ошибок, используйте следующий фрагмент кода:
func onSignUpStartError(error: MSAL.SignUpStartError) {
if error.isUserAlreadyExists {
resultTextView.text = "Unable to sign up: User already exists"
} else if error.isInvalidPassword {
resultTextView.text = "Unable to sign up: The password is invalid"
} else if error.isInvalidUsername {
resultTextView.text = "Unable to sign up: The username is invalid"
} else {
resultTextView.text = "Unexpected error signing up: \(error.errorDescription ?? "no description")"
}
}
Необязательно. Вход после потока регистрации
После успешного выполнения регистрации вы можете войти в систему пользователя, не инициируя поток входа. Дополнительные сведения см. в руководстве. Автоматический вход пользователя после регистрации в статье приложения iOS/macOS.