Delen via


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

Van toepassing op: Witte cirkel met grijs X-symbool. Workforce-huurders Groene cirkel met wit vinkje. Externe huurders (meer informatie)

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.

Voorwaarden

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.
    • Aanmeldproces 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
        }
    
        let parameters = MSALNativeAuthSignUpParameters(username: email)
        nativeAuth.signUp(parameters: parameters, delegate: self)
    }
    
    • Als u een gebruiker wilt registreren met de e-mail eenmalige wachtwoordcode, gebruiken we de signUp(parameters:delegate) methode van de bibliotheek, die asynchroon reageert door een van de methoden aan te roepen op het doorgegeven gedelegeerde-object, die het SignUpStartDelegate-protocol moet implementeren. Met de volgende coderegel wordt het aanmeldproces van de gebruiker gestart.

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

      In de methode signUp(parameters:delegate) geven we een MSALNativeAuthSignUpParameters exemplaar door met het e-mailadres van de gebruiker uit het inzendingsformulier naast de gemachtigde (een klasse die het SignUpStartDelegate-protocol implementeert).

    • Als u een gebruiker wilt registreren met e-mail met 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
          }
      
          let parameters = MSALNativeAuthSignUpParameters(username: email)
          parameters.password = password
          nativeAuth.signUp(parameters: parameters, delegate: self)
      }
      

      we gebruiken de signUp(parameters:delegate) methode van 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(parameters: parameters, delegate: self)
      

      In de signUp(parameters:delegate) methode geven we een MSALNativeAuthSignUpParameters exemplaar door met het e-mailadres en het wachtwoord van de gebruiker naast de gemachtigde (een klasse die het SignUpStartDelegate-protocol implementeert).

    • Als u SignUpStartDelegate protocol wilt implementeren 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 van signUp(parameters:delegate)resulteert in een aanroep naar onSignUpCodeRequired() of onSignUpStartError() delegeringsmethoden. De 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, waarmee 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 SignUpVerifyCodeDelegate protocol wilt implementeren 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) accepteert een gemachtigdeparameter en we moeten de vereiste methoden implementeren in het SignUpVerifyCodeDelegate-protocol. In het meest voorkomende scenario ontvangen we een oproep van onSignUpCompleted(newState) die aangeeft dat de gebruiker is geregistreerd en het proces 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 methode signUp(parameters:delegate) kan worden aangeroepen door een MSALNativeAuthSignUpParameters met een eigenschap attributen.

  1. Gebruik het volgende codefragment om gebruikerskenmerken te verzamelen:

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

    De signUp(parameters:delegate)resulteert in een aanroep van de onSignUpCodeRequired()- of onSignUpStartError()-delegeermethoden, of in een aanroep van onSignUpAttributesInvalid(attributeNames: [String]) als deze is geïmplementeerd in de delegate.

  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, waardoor we toegang hebben 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(parameters:delegate) aan zonder attributen door te geven in het MSALNativeAuthSignUpParameters-exemplaar. De volgende stap bestaat uit het aanroepen van newState.submitCode(code: userSuppliedCode, delegate: self) om het e-mailadres van de gebruiker te verifiëren.

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

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 ook het SignUpAttributesRequiredDelegate-protocol als 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 genaamd attributeNames, dit is een lijst van alle attributen die door de ontwikkelaar zijn verzonden en die de invoervalidatie niet hebben doorstaan.
  • 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 met MSALNativeAuthRequiredAttribute objecten, waarin details worden beschreven over de gebruikerskenmerken die de API nodig heeft.

Beide delegatiemethoden bevatten een nieuwe toestandreferentie. We gebruiken de parameter newState om submitAttributes(attributes:delegate) opnieuw aan te roepen 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 registratieproces

Na een geslaagd aanmeldproces kunt u een gebruiker aanmelden zonder een aanmeldproces te hoeven initiëren. Meer informatie vindt u in de Zelfstudie: Gebruiker automatisch aanmelden na aanmelding in een iOS-/macOS-app artikel.

Volgende stap