Kurz: Přidání registrace do aplikace pro iOS/macOS pomocí nativního ověřování
platí pro: nájemníci pracovních sil
(další informace)
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.
- Řešení chyb při registraci.
Požadavky
- kurz : Příprava vaší aplikace pro iOS/macOS na nativní ověřování.
- Pokud chcete shromažďovat atributy uživatele během registrace, nakonfigurujte atributy uživatele při vytvoření toku registrace a přihlášení.
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:
- Získejte 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.
- Získejte jednorázový přístupový kód e-mailem 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 proces 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 } let parameters = MSALNativeAuthSignUpParameters(username: email) nativeAuth.signUp(parameters: parameters, delegate: self) }
K registraci uživatele pomocí jednorázového hesla e-mailu používáme metodu
signUp(parameters:delegate)
knihovny, která asynchronně reaguje voláním jedné z metod na předaném objektu delegáta, který musí implementovat protokolSignUpStartDelegate
. Následující řádek kódu zahájí proces registrace uživatele:nativeAuth.signUp(parameters: parameters, delegate: self)
V metodě
signUp(parameters:delegate)
předáváme instanciMSALNativeAuthSignUpParameters
obsahující e-mailovou adresu uživatele z formuláře pro odeslání spolu s delegátem (třída, která implementuje protokolSignUpStartDelegate
).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 } let parameters = MSALNativeAuthSignUpParameters(username: email) parameters.password = password nativeAuth.signUp(parameters: parameters, delegate: self) }
Používáme metodu
signUp(parameters:delegate)
knihovny, která reaguje asynchronně voláním jedné z metod na předaný objekt delegáta, který musí implementovat protokolSignUpStartDelegate
. Následující řádek kódu zahájí proces registrace uživatele:nativeAuth.signUp(parameters: parameters, delegate: self)
V metodě
signUp(parameters:delegate)
předáváme instanciMSALNativeAuthSignUpParameters
obsahující e-mailovou adresu uživatele a heslo spolu s delegátem (třída, která implementuje protokolSignUpStartDelegate
).K implementaci protokolu
SignUpStartDelegate
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í
signUp(parameters:delegate)
vede k volání metod delegátaonSignUpCodeRequired()
neboonSignUpStartError()
. Volá seonSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength)
, který označuje, že se odeslal kód, který ověří e-mailovou adresu uživatele. Kromě některých podrobností o tom, kde byl kód odeslán a kolik číslic obsahuje, má tato metoda delegáta takénewState
parametr typuSignUpCodeRequiredState
, který nám poskytuje přístup ke dvěma novým metodám:submitCode(code:delegate)
resendCode(delegate)
Aby bylo možné odeslat kód, který nám uživatel poskytl, použijte:
newState.submitCode(code: userSuppliedCode, delegate: self)
K implementaci protokolu
SignUpVerifyCodeDelegate
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!" } }
submitCode(code:delegate)
přijímá parametr delegáta a musíme implementovat požadované metody v protokoluSignUpVerifyCodeDelegate
. V nejběžnějším scénáři obdržíme voláníonSignUpCompleted(newState)
označující, že se uživatel zaregistroval a tok je dokončený.
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. Metodu signUp(parameters:delegate)
lze volat pomocí MSALNativeAuthSignUpParameters
, která má atributovou vlastnost.
Pokud chcete shromažďovat atributy uživatele, použijte následující fragment kódu:
let attributes = [ "country": "United States", "city": "Redmond" ] let parameters = MSALNativeAuthSignUpParameters(username: email) parameters.password = password parameters.attributes = attributes nativeAuth.signUp(parameters: parameters, delegate: self)
Výsledkem
signUp(parameters:delegate)
je volání metod delegátaonSignUpCodeRequired()
neboonSignUpStartError()
, nebo voláníonSignUpAttributesInvalid(attributeNames: [String])
, pokud je implementováno v delegátu.K implementaci protokolu
SignUpStartDelegate
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áonSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength)
označující, ž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á tato metoda delegátanewState
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(parameters:delegate)
bez předání jakýchkoliv atributů v instanci MSALNativeAuthSignUpParameters
. 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 má newState
parametr typu SignUpAttributesRequiredState
, který nám poskytuje přístup k nové metodě:
submitAttributes(attributes:delegate)
K odeslání atributů, které nám uživatel poskytl, použijte následující úryvek kódu:
let attributes = [
"country": "United States",
"city": "Redmond"
]
newState.submitAttributes(attributes: attributes, delegate: self)
Implementujeme také protokol SignUpAttributesRequiredDelegate
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 objektůMSALNativeAuthRequiredAttribute
, které popisují podrobnosti o atributech uživatele, které rozhraní API vyžaduje.
Obě delegátní metody obsahují odkaz na nový stav. K opětovnému volání submitAttributes(attributes:delegate)
s novými atributy používáme parametr newState
.
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 protokolu SignUpStartDelegate
jsme chybu prostě zobrazili 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 dokončení procesu 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 článku tutorial: Automatické přihlášení uživatele po registraci v aplikaci pro iOS/macOS.