Sdílet prostřednictvím


Kurz: Volání více rozhraní API v aplikaci pro iOS/macOS pomocí nativního ověřování

Platí pro: Zelený kruh s bílým symbolem zaškrtnutí iOS (Swift) Zelený kruh s bílým symbolem zaškrtnutí 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

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.

  1. 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ě jako protectedAPIScopes1.
    • Deklarujte volitelné řetězcové proměnné accessTokenAPI1 a accessTokenAPI2.
  2. 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 z nativeAuth 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.

  3. 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 a protectedApi2Pressed 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 a protectedAPIScopes2použ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, jestli protectedAPIScopes1 jsou zahrnuté v oborech výsledku a pokud protectedAPIUrl1 je k dispozici. Pokud ano, nastaví accessTokenAPI1 a zavolá accessProtectedAPI s adresou URL a tokenem. Provádí podobnou kontrolu protectedAPIScopes2 a protectedAPIUrl2aktualizaci accessTokenAPI2 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.