Share via


Zelfstudie: Registreren toevoegen in een iOS-/macOS-app met behulp van systeemeigen verificatie

Van toepassing op: Groene cirkel met een wit vinkje. iOS (Swift) Groene cirkel met een wit vinkje. macOS (Swift)

In deze zelfstudie ziet u hoe u zich registreert voor een gebruiker met eenmalige wachtwoordcode of gebruikersnaam (e-mailadres) en wachtwoord en hoe u gebruikerskenmerken in uw iOS-/macOS-app verzamelt met behulp van systeemeigen verificatie.

  • Registreer een gebruiker met een eenmalige wachtwoordcode of gebruikersnaam (e-mail) en wachtwoord.
  • Gebruikerskenmerken verzamelen tijdens de registratie.
  • Registratiefouten afhandelen.

Vereisten

Een gebruiker registreren

Als u een gebruiker wilt registreren met behulp van de eenmalige wachtwoordcode of gebruikersnaam (e-mailadres) en wachtwoord van een e-mail, verzamelt u een e-mailbericht van de gebruiker en verzendt u vervolgens een e-mail met een eenmalige wachtwoordcode naar de gebruiker. De gebruiker voert een geldige eenmalige wachtwoordcode voor een e-mail in om de gebruikersnaam te valideren.

Als u zich wilt registreren voor een gebruiker, moet u het volgende doen:

  1. Maak een gebruikersinterface (UI) om:

    • Verzamel een e-mailbericht van de gebruiker. Voeg validatie toe aan uw invoer om ervoor te zorgen dat de gebruiker een geldig e-mailadres invoert.
    • Verzamel een wachtwoord als u zich registreert met gebruikersnaam (e-mailadres) en wachtwoord.
    • Verzamel een eenmalige wachtwoordcode voor e-mail van de gebruiker.
    • Verzamel indien nodig gebruikerskenmerken.
    • Eenmalige wachtwoordcode opnieuw verzenden als de gebruiker deze niet ontvangt.
    • Registratiestroom starten.
  2. Voeg in uw app een knop toe waarvan de geselecteerde gebeurtenis het volgende codefragment activeert:

    @IBAction func signUpPressed(_: Any) {
        guard let email = emailTextField.text else {
            resultTextView.text = "Email or password not set"
            return
        }
    
        nativeAuth.signUp(username: email, delegate: self)
    }
    
    • Als u een gebruiker wilt registreren met behulp van eenmalige wachtwoordcode voor e-mail, gebruiken we de methode van signUp(username:delegate) de bibliotheek, die asynchroon reageert door een van de methoden aan te roepen voor het doorgegeven gedelegeerde-object, dat het SignUpStartDelegate protocol moet implementeren. Met de volgende regel code wordt het registratieproces van de gebruiker gestart:

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

      In de signUp(username:delegate) methode geven we het e-mailadres van de gebruiker door vanuit het inzendingsformulier en de gemachtigde (een klasse die het SignUpStartDelegate protocol implementeert).

    • Als u een gebruiker wilt registreren met een e-mailadres met een wachtwoord, gebruikt u de volgende codefragmenten:

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

      we gebruiken de methode van signUp(username:password:delegate) de bibliotheek, die asynchroon reageert door een van de methoden aan te roepen voor het doorgegeven gedelegeerde-object, dat het SignUpStartDelegate protocol moet implementeren. Met de volgende regel code wordt het registratieproces van de gebruiker gestart:

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

      In de signUp(username:password:delegate) methode geven we het e-mailadres van de gebruiker, hun wachtwoord en de gemachtigde door (een klasse die het SignUpStartDelegate protocol implementeert).

    • Als u protocol wilt implementeren SignUpStartDelegate als een uitbreiding voor onze klasse, gebruikt u:

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

      De aanroep naar signUp(username:password:delegate) of signUp(username:delegate) resulteert in een aanroep naar onSignUpCodeRequired() of onSignUpStartError() delegeringsmethoden. Deze onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength) wordt aangeroepen om aan te geven dat er een code is verzonden om het e-mailadres van de gebruiker te verifiëren. Naast enkele details van waar de code is verzonden en hoeveel cijfers de code bevat, heeft deze gedelegeerdemethode ook een newState parameter van het type SignUpCodeRequiredState, waardoor we toegang hebben tot twee nieuwe methoden:

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

      Als u de code wilt indienen waarmee de gebruiker ons heeft verstrekt, gebruikt u:

      newState.submitCode(code: userSuppliedCode, delegate: self)
      
      • Als u protocol wilt implementeren SignUpVerifyCodeDelegate als een uitbreiding voor onze klasse, gebruikt u:

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

        De submitCode(code:delegate) parameter accepteert een gemachtigde en we moeten de vereiste methoden in het SignUpVerifyCodeDelegate protocol implementeren. In het meest voorkomende scenario ontvangen we een aanroep om aan te onSignUpCompleted(newState) geven dat de gebruiker is geregistreerd en de stroom is voltooid.

Gebruikerskenmerken verzamelen tijdens het registreren

Of u nu een gebruiker registreert met eenmalige wachtwoordcode of gebruikersnaam (e-mailadres) en wachtwoord, u kunt gebruikerskenmerken verzamelen voordat het account van een gebruiker wordt gemaakt. De signUp(username:attributes:delegate) methode accepteert kenmerken als een parameter.

  1. Gebruik het volgende codefragment om gebruikerskenmerken te verzamelen:

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

    De signUp(username:attributes:delegate) of ignUp(username:password:attributes:delegate) resulteert in een aanroep naar onSignUpCodeRequired() methoden of onSignUpStartError() delegeringsmethoden, of in een aanroep naar onSignUpAttributesInvalid(attributeNames: [String]) of deze wordt geïmplementeerd in de gemachtigde.

  2. Gebruik het volgende codefragment om het SignUpStartDelegate protocol als uitbreiding voor onze klasse te implementeren:

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

    Als de kenmerken ongeldig zijn, wordt de methode onSignUpAttributesInvalid(attributeNames: [String]) aangeroepen. In dit geval geven we de lijst met ongeldige kenmerken weer voor de gebruiker. Anders wordt de onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength) aangeroepen om aan te geven dat er een code is verzonden om het e-mailadres van de gebruiker te verifiëren. Afgezien van details zoals de ontvanger van de code en het aantal cijfers van de code, heeft deze gedelegeerdemethode een newState parameter van het type SignUpCodeRequiredState, die ons toegang geeft tot twee nieuwe methoden:

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

Gebruikerskenmerken op een of meer pagina's

Als u de kenmerken wilt verspreiden over een of meer pagina's, moeten we de kenmerken instellen die we op verschillende pagina's willen verzamelen als verplicht in de tenantconfiguratie van de klantidentiteit en toegangsbeheer (CIAM).

We roepen signUp(username:password:delegate) aan zonder kenmerken door te geven. De volgende stap bestaat uit het bellen newState.submitCode(code: userSuppliedCode, delegate: self) om het e-mailadres van de gebruiker te verifiëren.

We implementeren het SignUpVerifyCodeDelegate protocol als een uitbreiding voor onze klasse, maar deze keer moeten we de optionele methode onSignUpAttributesRequired(attributes:newState) naast de vereiste methoden implementeren:

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

Deze gemachtigde methode heeft een newState parameter van het type SignUpAttributesRequiredState, die ons toegang geeft tot een nieuwe methode:

  • submitAttributes(attributes:delegate)

Als u de kenmerken wilt verzenden waarmee de gebruiker ons heeft verstrekt, gebruikt u het volgende codefragment:

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

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

We implementeren het SignUpAttributesRequiredDelegate protocol ook als een uitbreiding voor onze klasse:

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

Wanneer de gebruiker niet alle vereiste kenmerken opgeeft of de kenmerken ongeldig zijn, worden deze gemachtigdenmethoden aangeroepen:

  • onSignUpAttributesInvalid: geeft aan dat een of meer kenmerken die zijn verzonden, de invoervalidatie is mislukt. Deze fout bevat een parameter attributeNames, een lijst met alle kenmerken die zijn verzonden door de ontwikkelaar die de invoervalidatie heeft mislukt.
  • onSignUpAttributesRequired: geeft aan dat voor de server een of meer kenmerken moeten worden verzonden, voordat het gebruikersaccount kan worden gemaakt. Dit gebeurt wanneer een of meer kenmerken zijn ingesteld als verplicht in de tenantconfiguratie. Dit resultaat bevat kenmerkenparameter, een lijst MSALNativeAuthRequiredAttribute met objecten, waarin details worden beschreven over de gebruikerskenmerken die de API nodig heeft.

Beide gemachtigdenmethoden bevatten een nieuwe statusreferentie. We gebruiken de newState parameter om opnieuw aan te roepen submitAttributes(attributes:delegate) met de nieuwe kenmerken.

Registratiefouten afhandelen

Tijdens de registratie slaagt niet elke actie. De gebruiker kan bijvoorbeeld proberen zich aan te melden met een e-mailadres dat al in gebruik is of een ongeldige code verzenden.

In onze eerdere implementatie van SignUpStartDelegate protocol hebben we gewoon de fout weergegeven toen we de onSignUpStartError(error) gedelegeerde functie verwerkten.

Gebruik het volgende codefragment om de gebruikerservaring te verbeteren door het specifieke fouttype te beheren:

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

Optioneel: Aanmelden na een registratiestroom

Na een geslaagde aanmeldingsstroom kunt u zich aanmelden bij een gebruiker zonder dat u een aanmeldingsstroom hoeft in teitiëren. Meer informatie in de zelfstudie: Gebruikers automatisch aanmelden na aanmelding in een iOS-/macOS-app-artikel .

Volgende stap