Oktatóanyag: Több API meghívása iOS/macOS alkalmazásban natív hitelesítéssel
A következőkre vonatkozik: iOS (Swift) macOS (Swift)
Ebben az oktatóanyagban megtudhatja, hogyan szerezhet be hozzáférési jogkivonatot, és hogyan hívhat meg egy API-t az iOS/macOS alkalmazásban. A Microsoft Authentication Library (MSAL) natív hitelesítési SDK iOS/macOS rendszeren lehetővé teszi több hozzáférési jogkivonat beszerzését egyetlen bejelentkezéssel. Ez a képesség lehetővé teszi egy vagy több hozzáférési jogkivonat beszerzését anélkül, hogy a felhasználónak újra kellene adnia a hitelesítést.
Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:
- Egy vagy több hozzáférési jogkivonat beszerzése.
- API meghívása
Előfeltételek
- Végezze el a bejelentkezési felhasználók lépéseit , és natív hitelesítéssel hívjon meg egy API-t az iOS-es mintaalkalmazásban.
- Végezze el a következő oktatóanyag lépéseit : Bejelentkezés és kijelentkezés hozzáadása iOS/macOS alkalmazásban natív hitelesítéssel. Ez az oktatóanyag bemutatja, hogyan jelentkezhet be felhasználókba az iOS/macOS alkalmazásban natív hitelesítéssel.
Egy vagy több hozzáférési jogkivonat beszerzése
Az MSAL natív hitelesítési SDK több hozzáférési jogkivonatot is képes tárolni. A bejelentkezés után a függvény használatával getAccessToken(scope:)
és az új hozzáférési jogkivonat hatóköreinek megadásával szerezheti be a hozzáférési jogkivonatot.
Deklarálja és állítsa be az API-hatókörök egy csoportjának értékeit az alábbi kódrészlet használatával:
let protectedAPIUrl1: String? = nil let protectedAPIUrl2: String? = nil let protectedAPIScopes1: [String] = [] let protectedAPIScopes2: [String] = [] var accessTokenAPI1: String? var accessTokenAPI2: String?
- Inicializálás
protectedAPIUrl1
az első webes API URL-címével. - Inicializálás
protectedAPIUrl2
a második webes API URL-címével. - Definiáljon
protectedAPIScopes1
hatókörökkel az első API-hoz, például["api://<Resource_App_ID>/ToDoList.Read", "api://<Resource_App_ID>/ToDoList.ReadWrite"]
. - Definiálja
protectedAPIScopes2
a második API hatóköreit, hasonló módonprotectedAPIScopes1
. - Deklarálja az opcionális sztringváltozókat
accessTokenAPI1
ésaccessTokenAPI2
a .
- Inicializálás
Jelentkezzen be a felhasználóba a következő kódrészlet használatával:
@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) }
A
signInPressed
metódus kezeli a bejelentkezési gombot. Ellenőrzi, hogy az e-mail- és jelszómezők meg vannak-e töltve. Ha bármelyik üres, az "E-mail vagy jelszó nincs beállítva". Ha mindkét mező ki van töltve, naplózza az e-mailt, megjeleníti a "Bejelentkezés..." szöveget, és a megadott e-mail és jelszó használatával kezdeményezi asignIn
nativeAuth
bejelentkezést. Az SDK lekéri az alapértelmezett OIDC-hatókörökre (openid, offline_access, profil) érvényes jogkivonatot, mert nincsenek megadva hatókörök.Egy vagy több hozzáférési jogkivonat beszerzése a következő kódrészlet használatával:
@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) } }
A
protectedApi1Pressed
két különböző hatókörhöz tartozó hozzáférési jogkivonatok beszerzésének folyamatát ésprotectedApi2Pressed
módszereit a metódusok kezelik. Először biztosítják, hogy az egyes API-k URL-címe és hatókörei megfelelően legyenek konfigurálva. Ha az API hozzáférési jogkivonata már elérhető, közvetlenül hozzáfér az API-hoz. Ellenkező esetben hozzáférési jogkivonatot kér, és tájékoztatja a felhasználót a jogkivonatok folyamatban lévő lekérési folyamatáról.Hozzáférési jogkivonat
protectedAPIScopes1
hozzárendeléséhez ésprotectedAPIScopes2
használatához használja a következő kódrészletet: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")") }
A
onAccessTokenRetrieveCompleted
metódus kinyomtatja a hozzáférési jogkivonatot a konzolra. Ezután ellenőrzi, hogy szerepel-eprotectedAPIScopes1
az eredmény hatókörében, és hogyprotectedAPIUrl1
elérhető-e; ha igen, beállítja és meghívjaaccessTokenAPI1
accessProtectedAPI
az URL-címet és a jogkivonatot. Hasonló ellenőrzéstprotectedAPIScopes2
végez, ésprotectedAPIUrl2
ha teljesülnek a feltételek, frissítiaccessTokenAPI2
és végrehajtja az API-hívást. Végül a metódus megjelenít egy üzenetet a bejelentkezési állapottal, a hatókörökkel és a hozzáférési jogkivonattal, és frissíti a felhasználói felületet.A
onAccessTokenRetrieveError
metódus egy hibaüzenetet jelenít meg a hozzáférési jogkivonat lekérési hibájának leírásával vagy egy alapértelmezett üzenettel, ha nincs megadva leírás.
API meghívása
API meghívásához használja az alábbi kódrészleteket:
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()
}
A accessProtectedAPI
metódus get kérést küld a megadott API-végpontnak a megadott hozzáférési jogkivonat használatával. Konfigurálja a kérést a jogkivonattal az Engedélyezés fejlécben. Ha sikeres választ kap (HTTP-állapotkód: 200-299), deszerializálja a JSON-adatokat, és frissíti a felhasználói felületet a HTTP-állapotkóddal és a válasz törzsével. Ha hiba történik a kérés vagy a válasz kezelése során, a hibaüzenet megjelenik a felhasználói felületen. Ez a módszer az API 1 vagy az API 2 elérését teszi lehetővé a megadott URL-címtől és hozzáférési jogkivonattól függően.
Kapcsolódó tartalom
- Ismerje meg a natív hitelesítési API-referenciát.
- Testre szabhatja a külső bérlő hitelesítési felületének megjelenését és hangulatát.