Öğretici: Yerel kimlik doğrulamasını kullanarak iOS/macOS uygulamasında birden çok API çağırma
Şunlar için geçerlidir: iOS (Swift) macOS (Swift)
Bu öğreticide, iOS/macOS uygulamanızda erişim belirteci almayı ve API'yi çağırmayı öğreneceksiniz. iOS/macOS için Microsoft Kimlik Doğrulama Kitaplığı (MSAL) yerel kimlik doğrulama SDK'sı, tek bir oturum açma ile birden çok erişim belirteci edinmenizi sağlar. Bu özellik, bir kullanıcının yeniden kimlik doğrulamasını gerektirmeden bir veya daha fazla erişim belirteci almanıza olanak tanır.
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- Bir veya birden çok erişim belirteci alma.
- API çağırma
Önkoşullar
- Yerel kimlik doğrulaması kullanarak kullanıcıları oturum açma ve örnek iOS mobil uygulamasında API çağırma adımlarını tamamlayın.
- Öğretici: Yerel kimlik doğrulamasını kullanarak iOS/macOS uygulamasında oturum açma ve oturumu kapatma ekleme adımlarını tamamlayın. Bu öğreticide, yerel kimlik doğrulaması kullanarak iOS/macOS uygulamanızda kullanıcıların nasıl oturum açabileceğiniz gösterilmektedir.
Bir veya birden çok erişim belirteci alma
MSAL yerel kimlik doğrulama SDK'sı birden çok erişim belirtecini depolayabilir. Oturum açtıktan sonra, işlevini kullanarak getAccessToken(scope:)
ve vermek istediğiniz yeni erişim belirtecinin kapsamlarını belirterek bir erişim belirteci alabilirsiniz.
Aşağıdaki kod parçacığını kullanarak bir DIZI API kapsamı için değerleri bildirin ve ayarlayın:
let protectedAPIUrl1: String? = nil let protectedAPIUrl2: String? = nil let protectedAPIScopes1: [String] = [] let protectedAPIScopes2: [String] = [] var accessTokenAPI1: String? var accessTokenAPI2: String?
- İlk web API'nizin URL'si ile başlatın
protectedAPIUrl1
. - İkinci web API'nizin URL'si ile başlatın
protectedAPIUrl2
. - gibi
["api://<Resource_App_ID>/ToDoList.Read", "api://<Resource_App_ID>/ToDoList.ReadWrite"]
ilk API'nizin kapsamlarıyla tanımlayınprotectedAPIScopes1
. - İkinci API'nizin kapsamlarıyla tanımlama
protectedAPIScopes2
, benzeriprotectedAPIScopes1
. - İsteğe bağlı dize değişkenlerini ve
accessTokenAPI2
bildirinaccessTokenAPI1
.
- İlk web API'nizin URL'si ile başlatın
Aşağıdaki kod parçacığını kullanarak kullanıcı oturum açar:
@IBAction func signInPressed(_: Any) { guard let email = emailTextField.text, let password = passwordTextField.text else { resultTextView.text = "Email or password not set" return } print("Signing in with email \(email) and password") showResultText("Signing in...") nativeAuth.signIn(username: email, password: password, delegate: self) }
signInPressed
yöntemi, oturum açma düğmesine basma işlemini işler. E-posta ve parola alanlarının doldurulup doldurulmadığını denetler. Herhangi biri boşsa , "E-posta veya parola ayarlanmadı" ifadesini gösterir. Her iki alan da doldurulmuşsa, e-postayı günlüğe kaydeder, "Oturum aç..." görüntüler ve sağlanan e-posta ve parola ile yöntemininativeAuth
kullanaraksignIn
oturum açmayı başlatır. Sdk, hiçbir kapsam belirtilmediğinden varsayılan OIDC kapsamları (openid, offline_access, profil) için geçerli bir belirteç alır.Aşağıdaki kod parçacığını kullanarak bir veya birden çok erişim belirteci alın:
@IBAction func protectedApi1Pressed(_: Any) { guard let url = protectedAPIUrl1, !protectedAPIScopes1.isEmpty else { showResultText("API 1 not configured.") return } if let accessToken = accessTokenAPI1 { accessProtectedAPI(apiUrl: url, accessToken: accessToken) } else { accountResult?.getAccessToken(scopes: protectedAPIScopes1, delegate: self) let message = "Retrieving access token to use with API 1..." showResultText(message) print(message) } } @IBAction func protectedApi2Pressed(_: Any) { guard let url = protectedAPIUrl2, !protectedAPIScopes2.isEmpty else { showResultText("API 2 not configured.") return } if let accessToken = accessTokenAPI2 { accessProtectedAPI(apiUrl: url, accessToken: accessToken) } else { accountResult?.getAccessToken(scopes: protectedAPIScopes2, delegate: self) let message = "Retrieving access token to use with API 2..." showResultText(message) print(message) } }
ve
protectedApi2Pressed
yöntemleri,protectedApi1Pressed
iki farklı kapsam kümesi için erişim belirteçleri alma işlemini yönetir. İlk olarak her API'nin URL'lerinin ve kapsamlarının düzgün yapılandırıldığından emin olurlar. API için erişim belirteci zaten varsa, API'ye doğrudan erişir. Aksi takdirde, bir erişim belirteci isteğinde bulunur ve devam eden belirteç alma işlemi hakkında kullanıcıyı bilgilendirilir.ve
protectedAPIScopes2
öğesine erişim belirteci atamak içinprotectedAPIScopes1
aşağıdaki kod parçacığını kullanın:func onAccessTokenRetrieveCompleted(result: MSALNativeAuthTokenResult) { print("Access Token: \(result.accessToken)") if protectedAPIScopes1.allSatisfy(result.scopes.contains), let url = protectedAPIUrl1 { accessTokenAPI1 = result.accessToken accessProtectedAPI(apiUrl: url, accessToken: result.accessToken) } if protectedAPIScopes2.allSatisfy(result.scopes.contains(_:)), let url = protectedAPIUrl2 { accessTokenAPI2 = result.accessToken accessProtectedAPI(apiUrl: url, accessToken: result.accessToken) } showResultText("Signed in." + "\n\n" + "Scopes:\n\(result.scopes)" + "\n\n" + "Access Token:\n\(result.accessToken)") updateUI() } func onAccessTokenRetrieveError(error: MSAL.RetrieveAccessTokenError) { showResultText("Error retrieving access token: \(error.errorDescription ?? "No error description")") }
yöntemi,
onAccessTokenRetrieveCompleted
erişim belirtecini konsola yazdırır. Ardından sonucun kapsamlarına eklenip eklenmediğini ve kullanılabilir olup olmadığını denetlerprotectedAPIScopes1
; varsa URL ve belirteçle ayarlaraccessTokenAPI1
ve çağırıraccessProtectedAPI
.protectedAPIUrl1
veprotectedAPIUrl2
içinprotectedAPIScopes2
benzer bir denetim gerçekleştirir ve koşulların karşılanması durumunda API çağrısını güncelleştiriraccessTokenAPI2
ve yapar. Son olarak yöntemi oturum açma durumu, kapsamları ve erişim belirtecini içeren bir ileti görüntüler ve kullanıcı arabirimini güncelleştirir.yöntemi,
onAccessTokenRetrieveError
erişim belirteci alma hatasının açıklamasını içeren bir hata iletisi veya açıklama sağlanmazsa varsayılan bir ileti görüntüler.
API çağırma
BIR API'yi çağırmak için aşağıdaki kod parçacıklarını kullanın:
func accessProtectedAPI(apiUrl: String, accessToken: String) {
guard let url = URL(string: apiUrl) else {
let errorMessage = "Invalid API url"
print(errorMessage)
DispatchQueue.main.async {
self.showResultText(errorMessage)
}
return
}
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Error found when accessing API: \(error.localizedDescription)")
DispatchQueue.main.async {
self.showResultText(error.localizedDescription)
}
return
}
guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode)
else {
DispatchQueue.main.async {
self.showResultText("Unsuccessful response found when accessing the API")
}
return
}
guard let data = data, let result = try? JSONSerialization.jsonObject(with: data, options: []) else {
DispatchQueue.main.async {
self.showResultText("Couldn't deserialize result JSON")
}
return
}
DispatchQueue.main.async {
self.showResultText("""
Accessed API successfully using access token.
HTTP response code: \(httpResponse.statusCode)
HTTP response body: \(result)
""")
}
}
task.resume()
}
yöntemi, accessProtectedAPI
sağlanan erişim belirtecini kullanarak belirtilen API uç noktasına bir GET isteği gönderir. İsteği Yetkilendirme üst bilgisindeki belirteçle yapılandırıyor. Başarılı bir yanıt aldığında (HTTP durum kodu 200-299), JSON verilerini seri durumdan çıkartır ve kullanıcı arabirimini HTTP durum kodu ve yanıt gövdesiyle güncelleştirir. İstek veya yanıt işleme sırasında bir hata oluşursa, kullanıcı arabiriminde hata iletisini görüntüler. Bu yöntem, sağlanan URL'ye ve erişim belirtecine bağlı olarak API 1 veya API 2'ye erişim sağlar.
İlgili içerik
- Yerel kimlik doğrulama API'si başvurusunu keşfedin.
- Dış kiracı için kimlik doğrulama deneyiminin görünümünü özelleştirin.