Поделиться через


Руководство. Добавление регистрации в приложении iOS/macOS с помощью собственной проверки подлинности

Область применения: Зеленый круг с символом белой галочки. iOS (Swift) Зеленый круг с символом белой галочки. macOS (Swift) (Swift)

В этом руководстве показано, как зарегистрироваться пользователя с помощью однократного секретного кода или имени пользователя (электронной почты) и пароля, а также собирать атрибуты пользователей в приложении iOS/macOS с помощью собственной проверки подлинности.

  • Зарегистрируйте пользователя с помощью однократного секретного кода электронной почты или имени пользователя (электронной почты) и пароля.
  • Сбор атрибутов пользователей во время регистрации.
  • Обработка ошибок регистрации.

Необходимые компоненты

Регистрация пользователя

Чтобы зарегистрироваться у пользователя с помощью одноразового секретного кода или имени пользователя (электронной почты) и пароля, вы собираете сообщение электронной почты от пользователя, а затем отправляете сообщение электронной почты, содержащее одноразовый секретный код пользователю. Пользователь вводит допустимый секретный код электронной почты для проверки имени пользователя.

Чтобы зарегистрироваться у пользователя, необходимо выполнить следующие действия.

  1. Создайте пользовательский интерфейс для:

    • Сбор сообщения электронной почты от пользователя. Добавьте проверку в входные данные, чтобы убедиться, что пользователь вводит допустимый адрес электронной почты.
    • Соберите пароль при регистрации с помощью имени пользователя (электронной почты) и пароля.
    • Соберите одноразовый секретный код электронной почты от пользователя.
    • При необходимости соберите атрибуты пользователя.
    • Повторно отправьте одноразовый секретный код, если пользователь не получает его.
    • Запустите поток регистрации.
  2. В приложении добавьте кнопку, событие выбора которой активирует следующий фрагмент кода:

    @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) принимает атрибуты в качестве параметра.

  1. Чтобы собрать атрибуты пользователя, используйте следующий фрагмент кода:

    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]), если он реализован в делегате.

  2. Чтобы реализовать 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.

Следующий шаг