Aracılığıyla paylaş


Öğretici: Yerel kimlik doğrulaması kullanarak iOS/macOS uygulamasında oturum açma ve oturum kapatma ekleme

Şunlar için geçerlidir: Beyaz onay işareti simgesi olan yeşil daire. iOS (Swift) Beyaz onay işareti simgesi olan yeşil daire. macOS (Swift)

Bu öğreticide, yerel kimlik doğrulaması kullanarak iOS/macOS uygulamanızda tek seferlik geçiş kodu veya kullanıcı adı ve parola ile bir kullanıcının oturumunu açmayı ve oturumu kapatmayı gösterir.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Bir kerelik e-posta geçiş kodu veya kullanıcı adı (e-posta) ve parola kullanarak kullanıcı oturumu açın.
  • Kullanıcının oturumunu kapatın.
  • Oturum açma hatasını işleme

Önkoşullar

Oturum açma kullanıcısı

E-posta tek seferlik geçiş kodu akışını kullanarak bir kullanıcıda oturum açmak için, e-postayı yakalayın ve kullanıcının e-postasını doğrulaması için tek seferlik geçiş kodu içeren bir e-posta gönderin. Kullanıcı geçerli bir kerelik geçiş kodu girdiğinde, uygulama bunları oturum açar.

Parolalı e-posta akışını kullanarak bir kullanıcıda oturum açmak için e-postayı ve parolayı yakalayın. Kullanıcı adı ve parola geçerliyse, uygulama kullanıcıda oturum açar.

Bir kullanıcıda oturum açmak için şunları yapmanız gerekir:

  1. Kullanıcı arabirimi (UI) oluşturma:

    • Kullanıcıdan bir e-posta toplayın. Kullanıcının geçerli bir e-posta adresi girdiğinden emin olmak için girişlerinize doğrulama ekleyin.
    • Kullanıcı adı (e-posta) ve parola ile oturum açarsanız bir parola toplayın.
    • Tek seferlik e-posta geçiş koduyla oturum açarsanız kullanıcıdan tek seferlik bir e-posta geçiş kodu toplayın.
    • E-posta ile tek seferlik geçiş koduyla oturum açarsanız kullanıcının tek seferlik geçiş kodunu yeniden göndermesine izin vermek için bir düğme ekleyin.
  2. Kullanıcı arabiriminizde, aşağıdaki kod parçacığında gösterildiği gibi seçme olayı oturum açmayı başlatan bir düğme ekleyin:

        @IBAction func signInPressed(_: Any) {
        guard let email = emailTextField.text else {
            resultTextView.text = "email not set"
            return
        }
    
        nativeAuth.signIn(username: email, delegate: self)
    }
    

    E-posta tek seferlik geçiş kodu akışını kullanarak bir kullanıcıda oturum açmak için aşağıdaki kod parçacığını kullanırız:

    nativeAuth.signIn(username: email, delegate: self)
    

    Geçirilen signIn(username:delegate) temsilci nesnesinde yöntemlerden birini çağırarak zaman uyumsuz olarak yanıt veren yöntemin SignInStartDelegate protokolü uygulaması gerekir. Kullanıcının sağladığı e-posta adresini e-posta gönderme formunda geçirir ve temsilci olarak geçiririz self .

    Parola akışıyla e-posta kullanarak bir kullanıcıda oturum açmak için aşağıdaki kod parçacığını kullanırız:

    nativeAuth.signIn(username: email, password: password, delegate: self)
    

    yönteminde signIn(username:password:delegate) , kullanıcının bize sağladığı e-posta adresini, parolasını ve protokole SignInStartDelegate uygun temsilci nesnesini geçirirsiniz. Bu örnekte, değerini geçiririz self.

  3. E-posta tek seferlik geçiş kodu akışını kullanırken protokol uygulamak SignInStartDelegate için aşağıdaki kod parçacığını kullanın:

    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)"
        }
    }
    

    Temsilci signIn(username:delegate) yöntemleri çağrısının sonuçları. En yaygın senaryoda, onSignInCodeRequired(newState:sentTo:channelTargetType:codeLength) kullanıcının e-posta adresini doğrulamak için bir kod gönderildiğini belirtmek için çağrılır. Kodun nereye gönderildiğine ve kaç basamak içerdiğine ilişkin bazı ayrıntıların yanı sıra, bu temsilci yönteminin türünde SignInCodeRequiredStatebir newState parametresi de vardır ve bu da aşağıdaki iki yeni yönteme erişmemizi sağlar:

    • submitCode(code:delegate)
    • resendCode(delegate)

    Kullanıcının submitCode(code:delegate) tek seferlik geçiş kodu biçiminde sağladığı tek seferlik geçiş kodunu göndermek için aşağıdaki kod parçacığını kullanın:

    newState.submitCode(code: userSuppliedCode, delegate: self)
    

    tek submitCode(code:delegate) seferlik geçiş kodunu ve temsilci parametresini kabul eder. Kodu gönderdikten sonra, protokolü uygulayarak SignInVerifyCodeDelegate tek seferlik geçiş kodunu doğrulamanız gerekir.

    Sınıfınıza uzantı olarak protokol uygulamak SignInVerifyCodeDelegate için aşağıdaki kod parçacığını kullanın:

    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."
            result.getAccessToken(delegate: self)
        }
    }
    

    En yaygın senaryoda, kullanıcının oturum açtığını onSignInCompleted(result) belirten bir çağrısı alırsınız. Sonuç, öğesini almak access tokeniçin kullanılabilir.

    bir getAccessToken(delegate) temsilci parametresi kabul eder ve protokolde CredentialsDelegate gerekli yöntemleri uygulamamız gerekir.

    En yaygın senaryoda, kullanıcının bir edindiğini belirten bir access tokençağrısı onAccessTokenRetrieveCompleted(result) alırız.

    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. Parola akışıyla e-posta kullanırken protokol uygulamak SignInStartDelegate için aşağıdaki kod parçacığını kullanın:

    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
        }
    }
    

    En yaygın senaryoda, kullanıcının oturum açtığını onSignInCompleted(result) belirten bir çağrısı alırsınız. Sonuç, öğesini almak access tokeniçin kullanılabilir.

    bir getAccessToken(delegate) temsilci parametresi kabul eder ve protokolde CredentialsDelegate gerekli yöntemleri uygulamamız gerekir.

    En yaygın senaryoda, kullanıcının bir edindiğini belirten bir access tokençağrısı onAccessTokenRetrieveCompleted(result) alırız.

    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)"
        }
    }
    
    

Oturum açma hatalarını işleme

Oturum açma sırasında her eylem başarılı olmaz. Örneğin, kullanıcı var olmayan bir e-posta adresiyle oturum açmayı deneyebilir veya geçersiz bir kod gönderebilir.

  1. veya signIn(username, password) yöntemindeki signIn(username) hataları işlemek için aşağıdaki kod parçacığını kullanın:

    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. Yöntemdeki submitCode() hataları işlemek için aşağıdaki kod parçacığını kullanın:

    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")"
        }
    }
    

    Kullanıcı yanlış bir e-posta doğrulama kodu girerse, hata işleyicisi güncelleştirilmiş bir kod göndermek için kullanılabilecek bir SignInCodeRequiredState başvuru içerir. Önceki protokol uygulamamızda SignInVerifyCodeDelegate , temsilci işlevini işlediğimizde onSignInVerifyCodeError(error:newState) hatayı görüntüledik.

Kimlik belirteci taleplerini okuma

Uygulamanız bir kimlik belirteci aldıktan sonra geçerli hesapla ilişkili talepleri alabilirsiniz. Bunu yapmak için aşağıdaki kod parçacığını kullanın:

func onSignInCompleted(result: MSAL.MSALNativeAuthUserAccountResult) {
   let claims = result.account.accountClaims
   let preferredUsername = claims?["preferred_username"] as? String
}

Talep değerine erişmek için kullandığınız anahtar, kullanıcı özniteliğini belirteç talebi olarak eklediğinizde belirttiğiniz addır.

Belirteç taleplerine kullanıcı öznitelikleri ekleme makalesinde yerleşik ve özel öznitelikleri belirteç talepleri olarak eklemeyi öğrenin.

Oturumu kapatan kullanıcı

Bir kullanıcının oturumunu kapatmak içinMSALNativeAuthUserAccountResult, geri aramada onSignInCompleted aldığınız başvuruyu kullanın veya önbellekten oturum açmış herhangi bir hesabı almak ve üye değişkeninde accountResult bir başvuru depolamak için kullanıngetNativeAuthUserAccount().

  1. Projeniz için anahtarlık grubunu burada açıklandığı gibi yapılandırın.

  2. Sınıfınıza ViewController yeni bir üye değişkeni ekleyin: var accountResult: MSALNativeAuthUserAccountResult?.

  3. Başarıyla başlatıldıktan sonra nativeAuth şu satırı ekleyerek önbelleğe alınmış herhangi bir hesabı almak için güncelleştirinviewDidLoad: accountResult = nativeAuth.getNativeAuthUserAccount().

  4. signInCompleted hesap sonucunu depolamak için işleyiciyi güncelleştirin:

    func onSignInCompleted(result: MSALNativeAuthUserAccountResult) {
        resultTextView.text = "Signed in successfully"
    
        accountResult = result
    }
    
  5. Oturumu Kapat düğmesi ekleyin ve kullanıcıyı oturumu kapatmak için aşağıdaki kodu kullanın:

    @IBAction func signOutPressed(_: Any) {
        guard let accountResult = accountResult else {
            print("Not currently signed in")
            return
        }
    
        accountResult.signOut()
    
        self.accountResult = nil
    
        resultTextView.text = "Signed out"
    }
    

Uygulamanızdaki bir kullanıcının oturumunu kapatmak için gerekli tüm adımları başarıyla tamamladınız. Uygulamanızı derleyin ve çalıştırın. Her şey yolundaysa, oturumu başarıyla kapatmak için Oturumu kapat düğmesini seçebilmeniz gerekir.

Özel talep sağlayıcısını yapılandırma

Uygulamanıza verilen belirteci bir dış sistemden talep eklemek istiyorsanız, özel talep sağlayıcısı kullanın. Özel talep sağlayıcısı, dış sistemlerden talep getirmek için dış REST API'yi çağıran özel bir kimlik doğrulama uzantısından oluşur.

Güvenlik belirteçlerinize dış sistemden talep eklemek için Özel talep sağlayıcısı yapılandırma'daki adımları izleyin.