Sdílet prostřednictvím


Kurz: Přidání přihlášení a odhlášení v aplikaci pro iOS/macOS pomocí nativního ověřování

platí pro: bílý kruh se šedým symbolem X. nájemci pracovní síly zelený kruh se symbolem bílého zaškrtnutí.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

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:

  1. 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.
  2. 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í implementovat SignInStartDelegate protokol. Předáváme instanci MSALNativeAuthSignInParameters, která obsahuje e-mailovou adresu, kterou uživatel poskytuje ve formuláři pro odeslání e-mailu, a předáváme self 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 instanci MSALNativeAuthSignInParameters, která obsahuje e-mailovou adresu, kterou nám uživatel poskytl, a heslo spolu s objektem delegáta, který odpovídá protokolu SignInStartDelegate. V tomto příkladu předáváme self.

  3. 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 typu SignInCodeRequiredState, 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í protokolu SignInVerifyCodeDelegate.

    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á instanci MSALNativeAuthGetAccessTokenParameters a parametr delegáta a musíme implementovat požadované metody v protokolu CredentialsDelegate.

    V nejběžnějším scénáři obdržíme volání na onAccessTokenRetrieveCompleted(result) s tím, že uživatel získal access 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)"
        }
    }
    
    
  4. 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á instanci MSALNativeAuthGetAccessTokenParameters a parametr delegáta a musíme implementovat požadované metody v protokolu CredentialsDelegate.

    V nejběžnějším scénáři obdržíme volání onAccessTokenRetrieveCompleted(result), které označuje, že uživatel získal access 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.

  1. 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")"
        }
    }
    
  2. 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 protokolu SignInVerifyCodeDelegate jsme jednoduše zobrazili chybu, když jsme zpracovávali funkci delegáta onSignInVerifyCodeError(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.

  1. Nakonfigurujte skupinu řetězce klíčů pro váš projekt, jak je popsáno zde.

  2. Přidejte do třídy ViewController novou členovou proměnnou: var accountResult: MSALNativeAuthUserAccountResult?.

  3. Aktualizujte viewDidLoad, aby se načetl libovolný účet, který je uložený v mezipaměti, přidáním tohoto řádku po úspěšné inicializaci nativeAuth: accountResult = nativeAuth.getNativeAuthUserAccount().

  4. Aktualizujte obslužnou rutinu signInCompleted tak, aby ukládal výsledek účtu:

    func onSignInCompleted(result: MSALNativeAuthUserAccountResult) {
        resultTextView.text = "Signed in successfully"
    
        accountResult = result
    }
    
  5. 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í.