Delen via


Zelfstudie: Een beveiligde web-API aanroepen in de iOS-app (Swift)

Dit is de vierde zelfstudie in de reeks zelfstudies die u begeleidt bij het aanmelden van gebruikers en het aanroepen van een beveiligde web-API met behulp van Microsoft Entra ID.

In deze zelfstudie gaat u het volgende doen:

  • Een beveiligde web-API aanroepen.

Voorwaarden

API aanroepen

Zodra u een token hebt, kan uw app deze gebruiken in de HTTP-header om een geautoriseerde aanvraag naar Microsoft Graph te verzenden:

header-sleutel waarde
Machtiging Bearer <toegangstoken>

Voeg de volgende code toe aan de klasse ViewController:

    func getContentWithToken() {

        // Specify the Graph API endpoint
        let graphURI = getGraphEndpoint()
        let url = URL(string: graphURI)
        var request = URLRequest(url: url!)

        // Set the Authorization header for the request. We use Bearer tokens, so we specify Bearer + the token we got from the result
        request.setValue("Bearer \(self.accessToken)", forHTTPHeaderField: "Authorization")

        URLSession.shared.dataTask(with: request) { data, response, error in

            if let error = error {
                self.updateLogging(text: "Couldn't get graph result: \(error)")
                return
            }

            guard let result = try? JSONSerialization.jsonObject(with: data!, options: []) else {

                self.updateLogging(text: "Couldn't deserialize result JSON")
                return
            }

            self.updateLogging(text: "Result from Graph: \(result))")

            }.resume()
    }

Zie Microsoft Graph API voor meer informatie over de Microsoft Graph API.

Uw app testen

Bouw en implementeer de app op een testapparaat of simulator. U moet zich kunnen aanmelden en tokens ophalen voor Microsoft Entra ID of persoonlijke Microsoft-accounts.

De eerste keer dat een gebruiker zich aanmeldt bij uw app, wordt deze door Microsoft-identiteit gevraagd om toestemming te geven voor de aangevraagde machtigingen. Hoewel de meeste gebruikers toestemming kunnen geven, hebben sommige Microsoft Entra-tenants gebruikerstoestemming uitgeschakeld. Hiervoor moeten beheerders toestemming geven namens alle gebruikers. Registreer de scopes van uw app om dit scenario te ondersteunen.

Nadat u zich hebt aangemeld, worden de gegevens weergegeven die van het Microsoft Graph /me-eindpunt zijn verkregen.

Volgende stappen

Meer informatie over het bouwen van mobiele apps die beveiligde web-API's aanroepen in onze reeks scenario's met meerdere onderdelen.

Dit is de vierde zelfstudie in de reeks zelfstudies die u begeleidt bij het aanmelden van gebruikers en het aanroepen van een beveiligde web-API met behulp van externe Microsoft Entra-id.

In deze zelfstudie gaat u het volgende doen:

  • Een beveiligde web-API aanroepen.

Voorwaarden

  • Zelfstudie: Gebruikers aanmelden in de mobiele iOS-app (Swift)

  • Een API-registratie die ten minste één bereik (gedelegeerde machtigingen) en één app-rol (toepassingsmachtiging) beschikbaar maakt, zoals ToDoList.Read. Als u dat nog niet hebt gedaan, volgt u de instructies voor een API aanroepen in een mobiele iOS-voorbeeld-app om een functionele beveiligde ASP.NET Core-web-API te hebben. Zorg ervoor dat u de volgende stappen uitvoert:

    • Registreer een web-API-toepassing.
    • API-bereiken configureren.
    • App-rollen configureren.
    • Configureer optionele claims.
    • Kloon ofwel download voorbeeld web-API.
    • Configureer en voer voorbeeldweb-API uit.

API aanroepen

Gebruik de volgende code om een beveiligde web-API aan te roepen vanuit uw iOS-app:

    func getContentWithToken() {
        // Specify the API endpoint in _Configuration.swift_ file you created earlier
        guard let url = URL(string: Configuration.kProtectedAPIEndpoint) else {
            let errorMessage = "Invalid API url"
            print(errorMessage)
            updateLogging(text: errorMessage)
            return
        }
        var request = URLRequest(url: url)

        // Set the Authorization header for the request. We use Bearer tokens, so we specify Bearer + the token we got from the result
        request.setValue("Bearer \(self.accessToken)", forHTTPHeaderField: "Authorization")

        self.updateLogging(text: "Performing request...")

        URLSession.shared.dataTask(with: request) { data, response, error in

            if let error = error {
                self.updateLogging(text: "Couldn't get API result: \(error)")
                return
            }

            guard let httpResponse = response as? HTTPURLResponse,
                  (200...299).contains(httpResponse.statusCode)
            else {
                self.updateLogging(text: "Couldn't get API result: \(error)")
                return
            }

            guard let data = data, let result = try? JSONSerialization.jsonObject(with: data, options: []) else {
                self.updateLogging(text: "Couldn't deserialize result JSON")
                return
            }

            self.updateLogging(text: """
                                Accessed API successfully using access token.
                                HTTP response code: \(httpResponse.statusCode)
                                HTTP response body: \(result)
                                """)

            }.resume()
    }

De code geeft het API-eindpunt op, waardoor de geldigheid ervan wordt gewaarborgd. Vervolgens wordt een aanvraagobject samengesteld, waarbij de autorisatieheader wordt ingesteld met het verkregen toegangstoken. Nadat u de start van de aanvraag hebt aangemeld, wordt de aanvraag asynchroon uitgevoerd met behulp van URLSession.

Na voltooiing wordt gecontroleerd op eventuele fouten tijdens de aanvraag. Als er een fout optreedt, wordt het bijbehorende bericht in een logboek opgeslagen. Vervolgens wordt gecontroleerd of het HTTP-antwoord is geslaagd, zodat het binnen het bereik van 200 tot 299 statuscodes valt. Daarna worden de ontvangen JSON-gegevens gedeserialiseerd. Ten slotte wordt de logboektekst bijgewerkt, waarmee wordt aangegeven dat de API is geopend, samen met relevante HTTP-antwoorddetails.