Kurz: Volání více rozhraní API v aplikaci pro iOS/macOS pomocí nativního ověřování
Platí pro: iOS (Swift) macOS (Swift)
V tomto kurzu se dozvíte, jak získat přístupový token a volat rozhraní API v aplikaci pro iOS/macOS. Nativní sada SDK pro ověřování microsoft Authentication Library (MSAL) pro iOS/macOS umožňuje získat více přístupových tokenů pomocí jednotného přihlašování. Tato funkce umožňuje získat jeden nebo více přístupových tokenů bez nutnosti opětovného ověření uživatele.
V tomto kurzu se naučíte:
- Získejte jeden nebo více přístupových tokenů.
- Volání rozhraní API
Požadavky
- Dokončete kroky v části Přihlášení uživatelů a volání rozhraní API v ukázkové mobilní aplikaci pro iOS pomocí nativního ověřování.
- Dokončete kroky v kurzu: Přidání přihlášení a odhlášení v aplikaci pro iOS/macOS pomocí nativního ověřování. V tomto kurzu se dozvíte, jak přihlásit uživatele v aplikaci pro iOS/macOS pomocí nativního ověřování.
Získání jednoho nebo několika přístupových tokenů
Sada SDK nativního ověřování MSAL může ukládat více přístupových tokenů. Po přihlášení můžete získat přístupový token pomocí getAccessToken(scope:)
funkce a zadáním rozsahů nového přístupového tokenu, který chcete udělit.
Deklarujte a nastavte hodnoty pro sadu oborů rozhraní API pomocí následujícího fragmentu kódu:
let protectedAPIUrl1: String? = nil let protectedAPIUrl2: String? = nil let protectedAPIScopes1: [String] = [] let protectedAPIScopes2: [String] = [] var accessTokenAPI1: String? var accessTokenAPI2: String?
- Inicializuje
protectedAPIUrl1
se pomocí adresy URL vašeho prvního webového rozhraní API. - Inicializace
protectedAPIUrl2
s adresou URL druhého webového rozhraní API - Definujte
protectedAPIScopes1
rozsahy pro vaše první rozhraní API, například["api://<Resource_App_ID>/ToDoList.Read", "api://<Resource_App_ID>/ToDoList.ReadWrite"]
. - Definujte
protectedAPIScopes2
rozsahy pro druhé rozhraní API, podobně jakoprotectedAPIScopes1
. - Deklarujte volitelné řetězcové proměnné
accessTokenAPI1
aaccessTokenAPI2
.
- Inicializuje
Přihlásí uživatele pomocí následujícího fragmentu kódu:
@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) }
Metoda
signInPressed
zpracovává tlačítko pro přihlášení stisknutím. Zkontroluje, jestli jsou vyplněná pole e-mailu a hesla. Pokud je některý z těchto možností prázdný, zobrazí se "E-mail nebo heslo není nastavené". Pokud jsou obě pole vyplněná, zapíše se e-mail, zobrazí se "Přihlášení...", a iniciuje přihlášení pomocísignIn
metody znativeAuth
poskytnutého e-mailu a hesla. Sada SDK načte token platný pro výchozí obory OIDC (openid, offline_access, profil), protože nejsou zadány žádné obory.Získejte jeden nebo více přístupových tokenů pomocí následujícího fragmentu kódu:
@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) } }
Postupy
protectedApi1Pressed
aprotectedApi2Pressed
metody spravují proces získání přístupových tokenů pro dvě různé sady oborů. Nejprve zajistí, aby byly správně nakonfigurované adresy URL a rozsahy jednotlivých rozhraní API. Pokud už je přístupový token pro rozhraní API dostupný, přistupuje přímo k rozhraní API. V opačném případě požádá o přístupový token a informuje uživatele o probíhajícím procesu načítání tokenu.K přiřazení přístupového tokenu
protectedAPIScopes1
aprotectedAPIScopes2
použijte následující fragment kódu: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")") }
Metoda
onAccessTokenRetrieveCompleted
vytiskne přístupový token do konzoly. Potom zkontroluje, jestliprotectedAPIScopes1
jsou zahrnuté v oborech výsledku a pokudprotectedAPIUrl1
je k dispozici. Pokud ano, nastavíaccessTokenAPI1
a zavoláaccessProtectedAPI
s adresou URL a tokenem. Provádí podobnou kontroluprotectedAPIScopes2
aprotectedAPIUrl2
aktualizaciaccessTokenAPI2
a volání rozhraní API, pokud jsou splněny podmínky. Nakonec metoda zobrazí zprávu se stavem přihlášení, obory a přístupovým tokenem a aktualizuje uživatelské rozhraní.Metoda
onAccessTokenRetrieveError
zobrazí chybovou zprávu s popisem chyby načtení přístupového tokenu nebo výchozí zprávy, pokud není k dispozici žádný popis.
Volání rozhraní API
K volání rozhraní API použijte následující fragmenty kódu:
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()
}
Metoda accessProtectedAPI
odešle požadavek GET do zadaného koncového bodu rozhraní API pomocí poskytnutého přístupového tokenu. Nakonfiguruje požadavek pomocí tokenu v hlavičce Autorizace. Když obdrží úspěšnou odpověď (stavový kód HTTP 200–299), deserializuje data JSON a aktualizuje uživatelské rozhraní stavovým kódem HTTP a textem odpovědi. Pokud během zpracování požadavku nebo odpovědi dojde k chybě, zobrazí se v uživatelském rozhraní chybová zpráva. Tato metoda umožňuje přístup k rozhraní API 1 nebo API 2 v závislosti na zadané adrese URL a přístupovém tokenu.
Související obsah
- Prozkoumejte referenční informace k nativnímu rozhraní API pro ověřování.
- Přizpůsobte vzhled a chování prostředí ověřování pro externího tenanta.