Kurz: Přidání registrace do aplikace pro iOS/macOS pomocí nativního ověřování
Platí pro: iOS (Swift) 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
- Kurz: Příprava aplikace pro iOS/macOS na nativní ověřování
- Pokud chcete během registrace shromažďovat atributy uživatele, nakonfigurujte atributy uživatele při vytváření procesu registrace a přihlašování.
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:
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.
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í implementovatSignUpStartDelegate
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á implementujeSignUpStartDelegate
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í implementovatSignUpStartDelegate
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á implementujeSignUpStartDelegate
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 neboonSignUpStartError()
jejich volání. Volá seonSignUpCodeRequired(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 typuSignUpCodeRequiredState
, 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 vSignUpVerifyCodeDelegate
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.
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)
jeignUp(username:password:attributes:delegate)
voláníonSignUpCodeRequired()
metod buď neboonSignUpStartError()
delegáta, nebo voláníonSignUpAttributesInvalid(attributeNames: [String])
, pokud je implementováno v delegátu.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 typuSignUpCodeRequiredState
, 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 seznamMSALNativeAuthRequiredAttribute
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.