Sdílet prostřednictvím


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

Platí pro: Zelený kruh s bílým symbolem zaškrtnutí iOS (Swift) Zelený kruh s bílým symbolem zaškrtnutí macOS (Swift)

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.
  • Zpracování chyb registrace

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:

    • Shromážděte 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.
    • Shromážděte jednorázový přístupový kód e-mailu 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 tok 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
        }
    
        nativeAuth.signUp(username: email, delegate: self)
    }
    
    • K registraci uživatele pomocí jednorázového hesla e-mailu používáme metodu knihovny signUp(username:delegate) , která reaguje asynchronně voláním jedné z metod předávaného delegujícího objektu, který musí implementovat SignUpStartDelegate protokol. Následující řádek kódu zahájí proces registrace uživatele:

      nativeAuth.signUp(username: email, delegate: self)
      

      signUp(username:delegate) V metodě předáme e-mailovou adresu uživatele z formuláře pro odeslání a delegáta (třída, která implementuje SignUpStartDelegate protokol).

    • 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
          }
      
          nativeAuth.signUp(username: email,password: password,delegate: self)
      }
      

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

      nativeAuth.signUp(username: email, password: password, delegate: self)
      

      signUp(username:password:delegate) V metodě předáme e-mailovou adresu uživatele, heslo a delegáta (třídu, která implementuje SignUpStartDelegate protokol).

    • K implementaci SignUpStartDelegate protokolu 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í nebo signUp(username:password:delegate) signUp(username:delegate) výsledkem volání onSignUpCodeRequired() metod delegáta nebo onSignUpStartError() jejich volání. Volá se onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength) k označení, že kód byl odeslán k ověření e-mailové adresy uživatele. Spolu s některými podrobnostmi 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 dává přístup ke dvěma novým metodám:

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

      Pokud chcete odeslat kód, se kterým nám uživatel poskytl, použijte:

      newState.submitCode(code: userSuppliedCode, delegate: self)
      
      • K implementaci SignUpVerifyCodeDelegate protokolu 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!"
            }
        }
        

        Akceptuje submitCode(code:delegate) parametr delegáta a musíme implementovat požadované metody v SignUpVerifyCodeDelegate protokolu. V nejběžnějším scénáři obdržíme volání onSignUpCompleted(newState) s oznámením, že se uživatel zaregistroval a tok je hotový.

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. Metoda signUp(username:attributes:delegate) přijímá atributy jako parametr.

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

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

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

  2. K implementaci SignUpStartDelegate protokolu 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á kód, který označuje, onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength) ž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á newState tato metoda delegáta 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(username:password:delegate) bez předání atributů. 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 newState má parametr typu SignUpAttributesRequiredState, který nám dává přístup k nové metodě:

  • submitAttributes(attributes:delegate)

Pokud chcete odeslat atributy, se kterými nám uživatel poskytl, použijte následující fragment kódu:

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

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

Budeme také implementovat SignUpAttributesRequiredDelegate protokol 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 MSALNativeAuthRequiredAttribute objektů, které popisují podrobnosti o atributech uživatele, které rozhraní API vyžaduje.

Obě metody delegáta obsahují odkaz na nový stav. Parametr použijeme newState k opětovnému volání submitAttributes(attributes:delegate) s novými atributy.

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 SignUpStartDelegate protokolu jsme jednoduše zobrazili chybu 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 toku 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 kurzu: Přihlášení uživatele automaticky po registraci v článku o aplikaci pro iOS/macOS.

Další krok