Megosztás a következőn keresztül:


Oktatóanyag: Több API meghívása iOS/macOS alkalmazásban natív hitelesítéssel

A következőkre vonatkozik: Zöld kör fehér pipa jellel. iOS (Swift) Zöld kör fehér pipa jellel. 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

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.

  1. 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ódon protectedAPIScopes1.
    • Deklarálja az opcionális sztringváltozókat accessTokenAPI1 és accessTokenAPI2a .
  2. 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 a signIn 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.

  3. 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 és protectedApi2Pressed 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 és protectedAPIScopes2haszná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-e protectedAPIScopes1 az eredmény hatókörében, és hogy protectedAPIUrl1 elérhető-e; ha igen, beállítja és meghívja accessTokenAPI1 accessProtectedAPI az URL-címet és a jogkivonatot. Hasonló ellenőrzést protectedAPIScopes2 végez, és protectedAPIUrl2ha teljesülnek a feltételek, frissíti accessTokenAPI2 é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.