Självstudie: Lägga till registrering i en iOS/macOS-app med inbyggd autentisering
Gäller för: iOS (Swift) macOS (Swift)
Den här självstudien visar hur du registrerar en användare med e-postlösenord eller användarnamn (e-post) och lösenord och samlar in användarattribut i din iOS/macOS-app med inbyggd autentisering.
- Registrera en användare med e-postlösenord eller användarnamn (e-post) och lösenord via e-post.
- Samla in användarattribut under registreringen.
- Hantera registreringsfel.
Förutsättningar
- Självstudie: Förbered din iOS/macOS-app för intern autentisering.
- Om du vill samla in användarattribut under registreringen konfigurerar du användarattributen när du skapar ditt användarflöde för registrering och inloggning.
Registrera en användare
Om du vill registrera en användare med e-postlösenord eller användarnamn (e-post) och lösenord samlar du in ett e-postmeddelande från användaren och skickar sedan ett e-postmeddelande med ett engångslösenord till användaren. Användaren anger ett giltigt engångslösenord för e-post för att verifiera sitt användarnamn.
Om du vill registrera en användare måste du:
Skapa ett användargränssnitt (UI) för att:
- Samla in ett e-postmeddelande från användaren. Lägg till validering i dina indata för att se till att användaren anger en giltig e-postadress.
- Samla in ett lösenord om du registrerar dig med användarnamn (e-post) och lösenord.
- Samla in ett engångslösenord för e-post från användaren.
- Samla in användarattribut om det behövs.
- Skicka om engångslösenordet om användaren inte tar emot det.
- Starta registreringsflödet.
I din app lägger du till en knapp vars select-händelse utlöser följande kodfragment:
@IBAction func signUpPressed(_: Any) { guard let email = emailTextField.text else { resultTextView.text = "Email or password not set" return } nativeAuth.signUp(username: email, delegate: self) }
För att registrera en användare med e-post engångslösenord använder vi bibliotekets
signUp(username:delegate)
metod, som svarar asynkront genom att anropa någon av metoderna för det skickade ombudsobjektet, som måste implementeraSignUpStartDelegate
protokollet. Följande kodrad initierar registreringsprocessen för användare:nativeAuth.signUp(username: email, delegate: self)
signUp(username:delegate)
I metoden skickar vi användarens e-postadress från sändningsformuläret och ombudet (en klass som implementerarSignUpStartDelegate
protokollet).Om du vill registrera en användare med e-post med lösenord använder du följande kodfragment:
@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) }
Vi använder bibliotekets metod, som svarar asynkront genom att anropa en av metoderna för det skickade ombudsobjektet
signUp(username:password:delegate)
, som måste implementeraSignUpStartDelegate
protokollet. Följande kodrad initierar registreringsprocessen för användare:nativeAuth.signUp(username: email, password: password, delegate: self)
signUp(username:password:delegate)
I metoden skickar vi användarens e-postadress, deras lösenord och ombudet (en klass som implementerarSignUpStartDelegate
protokollet).Om du vill implementera
SignUpStartDelegate
protokoll som ett tillägg till vår klass använder 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)" } }
Anropet till
signUp(username:password:delegate)
ellersignUp(username:delegate)
resulterar i ett anrop till antingenonSignUpCodeRequired()
elleronSignUpStartError()
delegera metoder.onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength)
Anropas för att indikera att en kod har skickats för att verifiera användarens e-postadress. Tillsammans med viss information om var koden har skickats och hur många siffror den innehåller, har den här delegatmetoden också ennewState
parameter av typenSignUpCodeRequiredState
, som ger oss åtkomst till två nya metoder:submitCode(code:delegate)
resendCode(delegate)
Om du vill skicka koden som användaren har angett för oss använder du:
newState.submitCode(code: userSuppliedCode, delegate: self)
Om du vill implementera
SignUpVerifyCodeDelegate
protokoll som ett tillägg till vår klass använder du: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!" } }
Accepterar
submitCode(code:delegate)
en delegatparameter och vi måste implementera de metoder som krävs iSignUpVerifyCodeDelegate
protokollet. I det vanligaste scenariot får vi ett anrop tillonSignUpCompleted(newState)
som anger att användaren har registrerats och att flödet är klart.
Samla in användarattribut under registreringen
Oavsett om du registrerar en användare med e-postlösenord eller användarnamn (e-post) och lösenord kan du samla in användarattribut innan ett användarkonto skapas. Metoden signUp(username:attributes:delegate)
accepterar attribut som en parameter.
Om du vill samla in användarattribut använder du följande kodfragment:
let attributes = [ "country": "United States", "city": "Redmond" ] nativeAuth.signUp(username: email, attributes: attributes, delegate: self)
Eller
signUp(username:attributes:delegate)
ignUp(username:password:attributes:delegate)
resulterar i ett anrop till antingenonSignUpCodeRequired()
elleronSignUpStartError()
delegera metoder, eller i ett anrop tillonSignUpAttributesInvalid(attributeNames: [String])
om det implementeras i ombudet.Om du vill implementera protokollet
SignUpStartDelegate
som ett tillägg till vår klass använder du följande kodfragment: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)" } }
Om attributen är ogiltiga anropas metoden
onSignUpAttributesInvalid(attributeNames: [String])
. I det här fallet visar vi listan över ogiltiga attribut för användaren. Annars anropas föronSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength)
att indikera att en kod har skickats för att verifiera användarens e-postadress. Förutom information som mottagaren av koden och antalet siffror i koden har den här ombudsmetoden ennewState
parameter av typenSignUpCodeRequiredState
, som ger oss åtkomst till två nya metoder:submitCode(code:delegate)
resendCode(delegate)
Användarattribut på en eller flera sidor
För att sprida attributen på en eller flera sidor måste vi ange de attribut som vi tänker samla in på olika sidor som obligatoriska i klientkonfigurationen för kundidentitet och åtkomsthantering (CIAM).
Vi anropar signUp(username:password:delegate)
utan att skicka några attribut. Nästa steg är att anropa newState.submitCode(code: userSuppliedCode, delegate: self)
för att verifiera användarens e-post.
Vi implementerar SignUpVerifyCodeDelegate
protokollet som ett tillägg till vår klass som tidigare, men den här gången måste vi implementera den valfria metoden onSignUpAttributesRequired(attributes:newState)
utöver de metoder som krävs:
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!"
}
}
Den här ombudsmetoden har en newState
parameter av typen SignUpAttributesRequiredState
, som ger oss åtkomst till en ny metod:
submitAttributes(attributes:delegate)
Om du vill skicka de attribut som användaren har angett för oss använder du följande kodfragment:
let attributes = [
"country": "United States",
"city": "Redmond"
]
newState.submitAttributes(attributes: attributes, delegate: self)
Vi implementerar även protokollet SignUpAttributesRequiredDelegate
som ett tillägg till vår klass:
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!"
}
}
När användaren inte anger alla obligatoriska attribut, eller om attributen är ogiltiga, anropas dessa ombudsmetoder:
onSignUpAttributesInvalid
: anger att ett eller flera attribut som skickades misslyckades med validering av indata. Det här felet innehåller parametern attributeNames, som är en lista över alla attribut som skickades av utvecklaren som inte kunde validera indata.onSignUpAttributesRequired
: anger att servern kräver att ett eller flera attribut skickas innan användarkontot kan skapas. Detta inträffar när ett eller flera attribut anges som obligatoriska i klientkonfigurationen. Det här resultatet innehåller attributparametern, som är en lista överMSALNativeAuthRequiredAttribute
objekt, som beskriver information om de användarattribut som API:et kräver.
Båda delegeringsmetoderna innehåller en ny tillståndsreferens. Vi använder parametern newState
för att anropa submitAttributes(attributes:delegate)
igen med de nya attributen.
Hantera registreringsfel
Under registreringen lyckas inte alla åtgärder. Användaren kan till exempel försöka registrera sig med en e-postadress som redan används eller skicka en ogiltig kod.
I vår tidigare implementering av SignUpStartDelegate
protokollet visade vi helt enkelt felet när vi hanterade onSignUpStartError(error)
delegatfunktionen.
Om du vill förbättra användarupplevelsen genom att hantera den specifika feltypen använder du följande kodfragment:
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")"
}
}
Valfritt: Logga in efter ett registreringsflöde
Efter ett lyckat registreringsflöde kan du logga in en användare utan att initiera ett inloggningsflöde. Läs mer i artikeln Självstudie: Logga in användare automatiskt efter registrering i en iOS/macOS-app .