Öğretici: Yerel kimlik doğrulaması kullanarak iOS/macOS uygulamasında oturum açma ve oturum kapatma ekleme
Şunlar için geçerlidir: iOS (Swift) 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
- Öğretici: iOS/macOS uygulamanızı yerel kimlik doğrulaması için hazırlama.
- Parolayla e-posta kullanarak oturum açmak istiyorsanız, kaydolma ve oturum açma kullanıcı akışınızı oluştururken kullanıcı akışınızı Parola ile e-posta kullanacak şekilde yapılandırın.
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:
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.
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önteminSignInStartDelegate
protokolü uygulaması gerekir. Kullanıcının sağladığı e-posta adresini e-posta gönderme formunda geçirir ve temsilci olarak geçiririzself
.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 protokoleSignInStartDelegate
uygun temsilci nesnesini geçirirsiniz. Bu örnekte, değerini geçiririzself
.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ündeSignInCodeRequiredState
birnewState
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ü uygulayarakSignInVerifyCodeDelegate
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 almakaccess token
için kullanılabilir.bir
getAccessToken(delegate)
temsilci parametresi kabul eder ve protokoldeCredentialsDelegate
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)" } }
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 almakaccess token
için kullanılabilir.bir
getAccessToken(delegate)
temsilci parametresi kabul eder ve protokoldeCredentialsDelegate
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.
veya
signIn(username, password)
yöntemindekisignIn(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")" } }
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ızdaSignInVerifyCodeDelegate
, temsilci işlevini işlediğimizdeonSignInVerifyCodeError(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()
.
Projeniz için anahtarlık grubunu burada açıklandığı gibi yapılandırın.
Sınıfınıza
ViewController
yeni bir üye değişkeni ekleyin:var accountResult: MSALNativeAuthUserAccountResult?
.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()
.signInCompleted
hesap sonucunu depolamak için işleyiciyi güncelleştirin:func onSignInCompleted(result: MSALNativeAuthUserAccountResult) { resultTextView.text = "Signed in successfully" accountResult = result }
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.
İlgili içerik
- Özel bir talep sağlayıcısı yapılandırın.