Sdílet prostřednictvím


Kurz: Přidání registrace do aplikace pro iOS/macOS pomocí nativního ověřování

platí pro: bílý kruh se šedým symbolem X. nájemníci pracovních sil zelený kruh s bílou značkou zaškrtnutí. externí nájemníci. (další informace)

Tento kurz ukazuje, jak zaregistrovat uživatele pomocí jednorázového hesla e-mailu nebo uživatelského jména (e-mailu) a hesla a shromažďovat atributy uživatele v aplikaci pro iOS/macOS pomocí nativního ověřování.

  • Zaregistrujte uživatele pomocí jednorázového hesla e-mailu nebo uživatelského jména (e-mailu) a hesla.
  • Shromážděte atributy uživatele během registrace.
  • Řešení chyb při registraci.

Požadavky

Registrace uživatele

Pokud chcete zaregistrovat uživatele pomocí jednorázového hesla nebo uživatelského jména (e-mailu) a hesla, shromáždíte e-mail od uživatele a odešlete mu e-mail obsahující jednorázový přístupový kód e-mailu. Uživatel zadá platný jednorázový přístupový kód e-mailu, který ověří své uživatelské jméno.

Pokud se chcete zaregistrovat uživatele, musíte:

  1. Vytvořte uživatelské rozhraní pro:

    • Získejte e-mail od uživatele. Přidejte do vstupů ověření, abyste měli jistotu, že uživatel zadá platnou e-mailovou adresu.
    • Pokud se zaregistrujete pomocí uživatelského jména (e-mailu) a hesla, shromážděte heslo.
    • Získejte jednorázový přístupový kód e-mailem od uživatele.
    • V případě potřeby shromážděte atributy uživatele.
    • Jednorázové heslo odešlete znovu, pokud ho uživatel neobdrží.
    • Spusťte proces registrace.
  2. V aplikaci přidejte tlačítko, jehož výběr události aktivuje následující fragment kódu:

    @IBAction func signUpPressed(_: Any) {
        guard let email = emailTextField.text else {
            resultTextView.text = "Email or password not set"
            return
        }
    
        let parameters = MSALNativeAuthSignUpParameters(username: email)
        nativeAuth.signUp(parameters: parameters, delegate: self)
    }
    
    • K registraci uživatele pomocí jednorázového hesla e-mailu používáme metodu signUp(parameters:delegate) knihovny, která asynchronně reaguje voláním jedné z metod na předaném objektu delegáta, který musí implementovat protokol SignUpStartDelegate. Následující řádek kódu zahájí proces registrace uživatele:

      nativeAuth.signUp(parameters: parameters, delegate: self)
      

      V metodě signUp(parameters:delegate) předáváme instanci MSALNativeAuthSignUpParameters obsahující e-mailovou adresu uživatele z formuláře pro odeslání spolu s delegátem (třída, která implementuje protokol SignUpStartDelegate).

    • Pokud chcete zaregistrovat uživatele pomocí e-mailu s heslem, použijte následující fragmenty kódu:

      @IBAction func signUpPressed(_: Any) {
          guard let email = emailTextField.text, let password = passwordTextField.text else {
             resultTextView.text = "Email or password not set"
             return
          }
      
          let parameters = MSALNativeAuthSignUpParameters(username: email)
          parameters.password = password
          nativeAuth.signUp(parameters: parameters, delegate: self)
      }
      

      Používáme metodu signUp(parameters:delegate) knihovny, která reaguje asynchronně voláním jedné z metod na předaný objekt delegáta, který musí implementovat protokol SignUpStartDelegate. Následující řádek kódu zahájí proces registrace uživatele:

      nativeAuth.signUp(parameters: parameters, delegate: self)
      

      V metodě signUp(parameters:delegate) předáváme instanci MSALNativeAuthSignUpParameters obsahující e-mailovou adresu uživatele a heslo spolu s delegátem (třída, která implementuje protokol SignUpStartDelegate).

    • K implementaci protokolu SignUpStartDelegate jako rozšíření naší třídy použijte:

      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)"
          }
      }
      

      Volání signUp(parameters:delegate)vede k volání metod delegáta onSignUpCodeRequired() nebo onSignUpStartError(). Volá se onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength), který označuje, že se odeslal kód, který ověří e-mailovou adresu uživatele. Kromě některých podrobností o tom, kde byl kód odeslán a kolik číslic obsahuje, má tato metoda delegáta také newState parametr typu SignUpCodeRequiredState, který nám poskytuje přístup ke dvěma novým metodám:

      • submitCode(code:delegate)
      • resendCode(delegate)

      Aby bylo možné odeslat kód, který nám uživatel poskytl, použijte:

      newState.submitCode(code: userSuppliedCode, delegate: self)
      
      • K implementaci protokolu SignUpVerifyCodeDelegate jako rozšíření naší třídy použijte:

        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) přijímá parametr delegáta a musíme implementovat požadované metody v protokolu SignUpVerifyCodeDelegate. V nejběžnějším scénáři obdržíme volání onSignUpCompleted(newState) označující, že se uživatel zaregistroval a tok je dokončený.

Shromažďování atributů uživatele během registrace

Bez ohledu na to, jestli si zaregistrujete uživatele pomocí jednorázového hesla e-mailu nebo uživatelského jména (e-mailu) a hesla, můžete před vytvořením účtu uživatele shromažďovat atributy uživatele. Metodu signUp(parameters:delegate) lze volat pomocí MSALNativeAuthSignUpParameters, která má atributovou vlastnost.

  1. Pokud chcete shromažďovat atributy uživatele, použijte následující fragment kódu:

    let attributes = [
        "country": "United States",
        "city": "Redmond"
    ]
    
    let parameters = MSALNativeAuthSignUpParameters(username: email)
    parameters.password = password
    parameters.attributes = attributes
    nativeAuth.signUp(parameters: parameters, delegate: self)
    

    Výsledkem signUp(parameters:delegate)je volání metod delegáta onSignUpCodeRequired() nebo onSignUpStartError(), nebo volání onSignUpAttributesInvalid(attributeNames: [String]), pokud je implementováno v delegátu.

  2. K implementaci protokolu SignUpStartDelegate jako rozšíření naší třídy použijte následující fragment kódu:

    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)"
        }
    }
    

    Pokud jsou atributy neplatné, volá se metoda onSignUpAttributesInvalid(attributeNames: [String]). V tomto případě zobrazíme seznam neplatných atributů pro uživatele. V opačném případě se volá onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength) označující, že byl odeslán kód k ověření e-mailové adresy uživatele. Kromě podrobností, jako je příjemce kódu a počet číslic kódu, má tato metoda delegáta newState parametr typu SignUpCodeRequiredState, který nám poskytuje přístup ke dvěma novým metodám:

    • submitCode(code:delegate)
    • resendCode(delegate)

Atributy uživatele na jedné nebo více stránkách

Abychom mohli atributy rozšířit na jednu nebo více stránek, musíme nastavit atributy, které chceme shromažďovat na různých stránkách, jako povinné v konfiguraci tenanta CIAM (Identity and Access Management).

Voláme signUp(parameters:delegate) bez předání jakýchkoliv atributů v instanci MSALNativeAuthSignUpParameters. Dalším krokem bude volání newState.submitCode(code: userSuppliedCode, delegate: self) k ověření e-mailu uživatele.

Implementujeme SignUpVerifyCodeDelegate protokol jako rozšíření naší třídy jako předtím, ale tentokrát musíme implementovat volitelnou metodu onSignUpAttributesRequired(attributes:newState) kromě požadovaných metod:

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!"
    }
}

Tato metoda delegáta má newState parametr typu SignUpAttributesRequiredState, který nám poskytuje přístup k nové metodě:

  • submitAttributes(attributes:delegate)

K odeslání atributů, které nám uživatel poskytl, použijte následující úryvek kódu:

let attributes = [
    "country": "United States",
    "city": "Redmond"
]

newState.submitAttributes(attributes: attributes, delegate: self)

Implementujeme také protokol SignUpAttributesRequiredDelegate jako rozšíření naší třídy:

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!"
    }
}

Pokud uživatel nezadá všechny požadované atributy nebo jsou atributy neplatné, volají se tyto metody delegáta:

  • onSignUpAttributesInvalid: označuje, že jeden nebo více atributů, které byly odeslány, selhalo ověření vstupu. Tato chyba obsahuje parametr attributeNames, což je seznam všech atributů odeslaných vývojářem, který selhal při ověřování vstupu.
  • onSignUpAttributesRequired: označuje, že server před vytvořením uživatelského účtu vyžaduje odeslání jednoho nebo více atributů. K tomu dochází v případě, že je jeden nebo více atributů v konfiguraci tenanta nastaveno jako povinné. Tento výsledek obsahuje parametr atributů, což je seznam objektů MSALNativeAuthRequiredAttribute, které popisují podrobnosti o atributech uživatele, které rozhraní API vyžaduje.

Obě delegátní metody obsahují odkaz na nový stav. K opětovnému volání submitAttributes(attributes:delegate) s novými atributy používáme parametr newState.

Zpracování chyb registrace

Během registrace není každá akce úspěšná. Uživatel se například může pokusit zaregistrovat pomocí e-mailové adresy, která se už používá, nebo odeslat neplatný kód.

V naší dřívější implementaci protokolu SignUpStartDelegate jsme chybu prostě zobrazili při zpracování funkce delegáta onSignUpStartError(error).

Pokud chcete vylepšit uživatelské prostředí správou konkrétního typu chyby, použijte následující fragment kódu:

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")"
    }
}

Volitelné: Přihlášení po dokončení procesu registrace

Po úspěšném toku registrace se můžete přihlásit uživatele, aniž byste zahájili tok přihlášení. Další informace najdete v článku tutorial: Automatické přihlášení uživatele po registraci v aplikaci pro iOS/macOS.

Další krok