Kurz: Přidání přihlášení a odhlášení v aplikaci pro iOS/macOS pomocí nativního ověřování
platí pro: nájemci pracovní síly
externí nájemci (další informace)
V tomto kurzu se dozvíte, jak se přihlásit a odhlásit uživatele pomocí jednorázového hesla nebo uživatelského jména nebo uživatelského jména a hesla v aplikaci pro iOS/macOS pomocí nativního ověřování.
V tomto kurzu se naučíte:
- Přihlaste se k uživateli pomocí jednorázového hesla e-mailu nebo uživatelského jména (e-mailu) a hesla.
- Odhlaste se od uživatele.
- Zpracování chyby přihlášení
Požadavky
- Kurz : Příprava aplikace pro iOS/macOS na nativní ověřování.
- Pokud se chcete přihlásit pomocí e-mailu s heslem, nakonfigurujte tok uživatele tak, aby používal e-mail s heslem, když vytvoříte svůj tok registrace a přihlášení.
Přihlášení uživatele
Aby se uživatel přihlásil pomocí procesu jednorázového přístupového kódu e-mailem, zadejte e-mail uživatele a odešlete mu e-mail obsahující jednorázový přístupový kód, který mu umožní ověřit jeho e-mailovou adresu. Když uživatel zadá platné jednorázové heslo, aplikace ho přihlásí.
Pro přihlášení uživatele pomocí toku e-mailem a heslem zachyťte e-mail a heslo. Pokud je uživatelské jméno a heslo platné, aplikace se přihlásí uživatele.
Abyste mohli přihlásit 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 přihlásíte pomocí uživatelského jména (e-mailu) a hesla, shromážděte heslo.
- Pokud se přihlašujete pomocí jednorázového přístupového kódu zaslaného na e-mail, obdržíte od uživatele tento kód.
- Pokud se přihlásíte pomocí jednorázového hesla, přidejte tlačítko pro opětovné odeslání jednorázového hesla uživatele.
V uživatelském rozhraní přidejte tlačítko, jehož událost výběru spustí přihlášení, jak je znázorněno v následujícím fragmentu kódu:
@IBAction func signInPressed(_: Any) { guard let email = emailTextField.text else { resultTextView.text = "email not set" return } let parameters = MSALNativeAuthSignInParameters(username: email) nativeAuth.signIn(parameters: parameters, delegate: self) }
K přihlášení uživatele pomocí jednorázového hesla e-mailem toku použijeme následující fragment kódu:
nativeAuth.signIn(parameters: parameters, delegate: self)
Metoda
signIn(parameters:delegate)
, která reaguje asynchronně voláním jedné z metod předávaného delegování objektu, musí implementovatSignInStartDelegate
protokol. Předáváme instanciMSALNativeAuthSignInParameters
, která obsahuje e-mailovou adresu, kterou uživatel poskytuje ve formuláři pro odeslání e-mailu, a předávámeself
jako delegát.Pokud se chcete přihlásit uživatele pomocí e-mailu s tokem hesla, použijeme následující fragment kódu:
let parameters = MSALNativeAuthSignInParameters(username: email) parameters.password = password nativeAuth.signIn(parameters: parameters, delegate: self)
V metodě
signIn(parameters:delegate)
předáte instanciMSALNativeAuthSignInParameters
, která obsahuje e-mailovou adresu, kterou nám uživatel poskytl, a heslo spolu s objektem delegáta, který odpovídá protokoluSignInStartDelegate
. V tomto příkladu předávámeself
.Pokud chcete implementovat protokol
SignInStartDelegate
při použití jednorázového hesla e-mailu toku, použijte následující fragment kódu:extension ViewController: SignInStartDelegate { func onSignInStartError(error: MSAL.SignInStartError) { resultTextView.text = "Error signing in: \(error.errorDescription ?? "no description")" } func onSignInCodeRequired( newState: MSAL.SignInCodeRequiredState, sentTo: String, channelTargetType: MSAL.MSALNativeAuthChannelType, codeLength: Int ) { resultTextView.text = "Verification code sent to \(sentTo)" } }
Voláním
signIn(parameters:delegate)
dojde k volání delegovaných metod. V nejběžnějším scénáři se voláonSignInCodeRequired(newState:sentTo:channelTargetType:codeLength)
označující, že se odeslal kód k ověření e-mailové adresy 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 typuSignInCodeRequiredState
, který nám poskytuje přístup k následujícím dvěma novým metodám:submitCode(code:delegate)
resendCode(delegate)
Pomocí
submitCode(code:delegate)
odešlete jednorázové heslo, které uživatel poskytuje ve formuláři jednorázového hesla, použijte následující fragment kódu:newState.submitCode(code: userSuppliedCode, delegate: self)
submitCode(code:delegate)
přijímá jednorázový přístupový kód a parametr delegáta. Po odeslání kódu musíte jednorázový přístupový kód ověřit implementací protokoluSignInVerifyCodeDelegate
.K implementaci protokolu
SignInVerifyCodeDelegate
jako rozšíření třídy použijte následující fragment kódu:extension ViewController: SignInVerifyCodeDelegate { func onSignInVerifyCodeError(error: MSAL.VerifyCodeError, newState: MSAL.SignInCodeRequiredState?) { resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")" } func onSignInCompleted(result: MSALNativeAuthUserAccountResult) { resultTextView.text = "Signed in successfully." let parameters = MSALNativeAuthGetAccessTokenParameters() result.getAccessToken(parameters: parameters, delegate: self) } }
V nejběžnějším scénáři obdržíme volání
onSignInCompleted(result)
označující, že se uživatel přihlásil. Výsledek lze použít k načteníaccess token
.getAccessToken(parameters:delegate)
přijímá instanciMSALNativeAuthGetAccessTokenParameters
a parametr delegáta a musíme implementovat požadované metody v protokoluCredentialsDelegate
.V nejběžnějším scénáři obdržíme volání na
onAccessTokenRetrieveCompleted(result)
s tím, že uživatel získalaccess token
.extension ViewController: CredentialsDelegate { func onAccessTokenRetrieveError(error: MSAL.RetrieveAccessTokenError) { resultTextView.text = "Error retrieving access token" } func onAccessTokenRetrieveCompleted(result: MSALNativeAuthTokenResult) { resultTextView.text = "Signed in. Access Token: \(result.accessToken)" } }
Pokud chcete implementovat protokol
SignInStartDelegate
při použití e-mailu s tokem hesla, použijte následující fragment kódu:extension ViewController: SignInStartDelegate { func onSignInStartError(error: MSAL.SignInStartError) { resultTextView.text = "Error signing in: \(error.errorDescription ?? "no description")" } func onSignInCompleted(result: MSAL.MSALNativeAuthUserAccountResult) { // User successfully signed in } }
V nejběžnějším scénáři obdržíme volání
onSignInCompleted(result)
označující, že se uživatel přihlásil. Výsledek může být použit k načteníaccess token
.getAccessToken(parameters:delegate)
přijímá instanciMSALNativeAuthGetAccessTokenParameters
a parametr delegáta a musíme implementovat požadované metody v protokoluCredentialsDelegate
.V nejběžnějším scénáři obdržíme volání
onAccessTokenRetrieveCompleted(result)
, které označuje, že uživatel získalaccess token
.extension ViewController: CredentialsDelegate { func onAccessTokenRetrieveError(error: MSAL.RetrieveAccessTokenError) { resultTextView.text = "Error retrieving access token" } func onAccessTokenRetrieveCompleted(result: MSALNativeAuthTokenResult) { resultTextView.text = "Signed in. Access Token: \(result.accessToken)" } }
Zpracování chyb přihlášení
Během přihlášení ne každá akce proběhne úspěšně. Uživatel se například může pokusit přihlásit pomocí e-mailové adresy, která neexistuje, nebo odeslat neplatný kód.
K zpracování chyb v metodě
signIn(parameters:delegate)
použijte následující fragment kódu:func onSignInStartError(error: MSAL.SignInStartError) { if error.isUserNotFound || error.isInvalidUsername { resultTextView.text = "Invalid username" } else { resultTextView.text = "Error signing in: \(error.errorDescription ?? "no description")" } }
K zpracování chyb v metodě
submitCode()
použijte následující fragment kódu:func onSignInVerifyCodeError(error: MSAL.VerifyCodeError, newState: MSAL.SignInCodeRequiredState?) { if error.isInvalidCode { // Inform the user that the submitted code was incorrect and ask for a new code to be supplied let userSuppliedCode = retrieveNewCode() newState?.submitCode(code: userSuppliedCode, delegate: self) } else { resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")" } }
Pokud uživatel zadá nesprávný ověřovací kód e-mailu, obslužná rutina chyby obsahuje odkaz na
SignInCodeRequiredState
, který lze použít k odeslání aktualizovaného kódu. V naší dřívější implementaci protokoluSignInVerifyCodeDelegate
jsme jednoduše zobrazili chybu, když jsme zpracovávali funkci delegátaonSignInVerifyCodeError(error:newState)
.
Přečíst nároky tokenu ID
Jakmile vaše aplikace získá ID token, můžete načíst nároky přidružené k aktuálnímu účtu. K tomu použijte následující fragment kódu:
func onSignInCompleted(result: MSAL.MSALNativeAuthUserAccountResult) {
let claims = result.account.accountClaims
let preferredUsername = claims?["preferred_username"] as? String
}
Klíč, který používáte pro přístup k hodnotě deklarace, je název, který zadáte při přidání uživatelského atributu jako deklarace tokenu.
Naučte se, jak přidávat předdefinované a vlastní atributy jako deklarace tokenů v článku Přidání atributů uživatele do deklarací identity tokenů.
Odhlásit uživatele
Pokud chcete odhlásit uživatele, použijte referenci na MSALNativeAuthUserAccountResult
, kterou jste dostali ve zpětném volání onSignInCompleted
, nebo použijte getNativeAuthUserAccount()
k získání jakéhokoli přihlášeného účtu z mezipaměti a uložte referenci do členské proměnné accountResult
.
Nakonfigurujte skupinu řetězce klíčů pro váš projekt, jak je popsáno zde.
Přidejte do třídy
ViewController
novou členovou proměnnou:var accountResult: MSALNativeAuthUserAccountResult?
.Aktualizujte
viewDidLoad
, aby se načetl libovolný účet, který je uložený v mezipaměti, přidáním tohoto řádku po úspěšné inicializacinativeAuth
:accountResult = nativeAuth.getNativeAuthUserAccount()
.Aktualizujte obslužnou rutinu
signInCompleted
tak, aby ukládal výsledek účtu:func onSignInCompleted(result: MSALNativeAuthUserAccountResult) { resultTextView.text = "Signed in successfully" accountResult = result }
Přidejte tlačítko Odhlásit se a pomocí následujícího kódu odhlaste uživatele:
@IBAction func signOutPressed(_: Any) { guard let accountResult = accountResult else { print("Not currently signed in") return } accountResult.signOut() self.accountResult = nil resultTextView.text = "Signed out" }
Úspěšně jste dokončili všechny potřebné kroky pro odhlášení uživatele ve vaší aplikaci. Sestavte a spusťte aplikaci. Pokud je všechno v pořádku, měli byste být schopni vybrat tlačítko odhlásit se, abyste se mohli úspěšně odhlásit.
Konfigurace vlastního zprostředkovatele deklarací
Pokud chcete přidat nároky z externího systému do tokenu vydaného vaší aplikaci, použijte vlastního zprostředkovatele nároků. Vlastní poskytovatel nároků se skládá z vlastního rozšíření pro ověřování, které volá externí rozhraní REST API, aby získalo nároky z externích systémů.
Postupujte podle kroků v Konfigurace zprostředkovatele vlastních deklarací pro přidání deklarací z externího systému do tokenů zabezpečení.