Zelfstudie: Meerdere API's aanroepen in de iOS-/macOS-app met behulp van systeemeigen verificatie
Van toepassing op: iOS (Swift) macOS (Swift)
In deze zelfstudie leert u hoe u een toegangstoken verkrijgt en een API aanroept in uw iOS-/macOS-app. Met microsoft Authentication Library (MSAL) native authentication SDK voor iOS/macOS kunt u meerdere toegangstokens verkrijgen met eenmalige aanmelding. Met deze mogelijkheid kunt u een of meer toegangstokens verkrijgen zonder dat een gebruiker zich opnieuw moet verifiëren.
In deze zelfstudie leert u het volgende:
- Een of meer toegangstokens verkrijgen.
- Een API aanroepen
Vereisten
- Voer de stappen in Gebruikers aanmelden uit en roep een API aan in een voorbeeld van een mobiele iOS-app met behulp van systeemeigen verificatie.
- Voltooi de stappen in zelfstudie: Aanmelding en afmelding toevoegen aan de iOS-/macOS-app met behulp van systeemeigen verificatie. In deze zelfstudie leert u hoe u gebruikers kunt aanmelden in uw iOS-/macOS-app met behulp van systeemeigen verificatie.
Een of meer toegangstokens verkrijgen
DE SYSTEEMeigen VERIFICATIE-SDK van MSAL kan meerdere toegangstokens opslaan. Nadat u zich hebt aangemeld, kunt u een toegangstoken verkrijgen met behulp van de getAccessToken(scope:)
functie en de bereiken opgeven voor het nieuwe toegangstoken dat u wilt verlenen.
Declareer en stel waarden in voor een set API-bereiken met behulp van het volgende codefragment:
let protectedAPIUrl1: String? = nil let protectedAPIUrl2: String? = nil let protectedAPIScopes1: [String] = [] let protectedAPIScopes2: [String] = [] var accessTokenAPI1: String? var accessTokenAPI2: String?
- Initialiseer
protectedAPIUrl1
met de URL van uw eerste web-API. - Initialiseer
protectedAPIUrl2
met de URL van uw tweede web-API. - Definiëren
protectedAPIScopes1
met bereiken voor uw eerste API, zoals["api://<Resource_App_ID>/ToDoList.Read", "api://<Resource_App_ID>/ToDoList.ReadWrite"]
. - Definiëren
protectedAPIScopes2
met bereiken voor uw tweede API, vergelijkbaar metprotectedAPIScopes1
. - Declareer de optionele tekenreeksvariabelen
accessTokenAPI1
enaccessTokenAPI2
.
- Initialiseer
Gebruikers aanmelden met behulp van het volgende codefragment:
@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) }
De
signInPressed
methode verwerkt de aanmeldknop. Er wordt gecontroleerd of de velden voor e-mail en wachtwoord zijn ingevuld. Als een van beide leeg is, wordt 'E-mail of wachtwoord niet ingesteld' weergegeven. Als beide velden zijn ingevuld, wordt het e-mailbericht vastgelegd, wordt 'Aanmelden...' weergegeven en wordt de aanmelding gestart met behulp van designIn
methode vannativeAuth
het opgegeven e-mailadres en wachtwoord. De SDK haalt een token op dat geldig is voor de standaard OIDC-bereiken (openid, offline_access, profiel), omdat er geen bereiken zijn opgegeven.Haal een of meer toegangstokens op met behulp van het volgende codefragment:
@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) } }
De
protectedApi1Pressed
enprotectedApi2Pressed
methoden beheren het proces voor het verkrijgen van toegangstokens voor twee afzonderlijke sets bereiken. Ze zorgen er eerst voor dat de URL en bereiken van elke API correct zijn geconfigureerd. Als er al een toegangstoken voor de API beschikbaar is, heeft deze rechtstreeks toegang tot de API. Anders vraagt het een toegangstoken aan en informeert de gebruiker over het lopende proces voor het ophalen van tokens.Gebruik het volgende codefragment om een toegangstoken toe te
protectedAPIScopes1
wijzen enprotectedAPIScopes2
gebruik het volgende codefragment: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")") }
De
onAccessTokenRetrieveCompleted
methode drukt het toegangstoken af op de console. Vervolgens wordt gecontroleerd ofprotectedAPIScopes1
deze zijn opgenomen in de bereiken van het resultaat en of dit beschikbaar is. AlsprotectedAPIUrl1
dat het het beste is, wordt de URL en het token ingesteldaccessTokenAPI1
en aangeroepenaccessProtectedAPI
. Er wordt een vergelijkbare controle uitgevoerd opprotectedAPIScopes2
en, hetprotectedAPIUrl2
bijwerkenaccessTokenAPI2
en maken van de API-aanroep als aan voorwaarden wordt voldaan. Ten slotte geeft de methode een bericht weer met de aangemelde status, bereiken en toegangstoken en wordt de gebruikersinterface bijgewerkt.De
onAccessTokenRetrieveError
methode geeft een foutbericht weer met de beschrijving van de fout bij het ophalen van het toegangstoken of een standaardbericht als er geen beschrijving is opgegeven.
Een API aanroepen
Gebruik de volgende codefragmenten om een API aan te roepen:
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()
}
De accessProtectedAPI
methode verzendt een GET-aanvraag naar het opgegeven API-eindpunt met behulp van het opgegeven toegangstoken. De aanvraag wordt geconfigureerd met het token in de autorisatieheader. Wanneer het een geslaagd antwoord ontvangt (HTTP-statuscode 200-299), worden de JSON-gegevens gedeserialiseerd en wordt de gebruikersinterface bijgewerkt met de HTTP-statuscode en antwoordtekst. Als er een fout optreedt tijdens de verwerking van aanvragen of antwoorden, wordt het foutbericht weergegeven in de gebruikersinterface. Deze methode biedt toegang tot API 1 of API 2, afhankelijk van de URL en het opgegeven toegangstoken.