Aracılığıyla paylaş


Öğretici: Yerel kimlik doğrulamasını kullanarak iOS/macOS uygulamasında birden çok API çağırma

Şunlar için geçerlidir: Beyaz onay işareti simgesi olan yeşil daire. iOS (Swift) Beyaz onay işareti simgesi olan yeşil daire. macOS (Swift)

Bu öğreticide, iOS/macOS uygulamanızda erişim belirteci almayı ve API'yi çağırmayı öğreneceksiniz. iOS/macOS için Microsoft Kimlik Doğrulama Kitaplığı (MSAL) yerel kimlik doğrulama SDK'sı, tek bir oturum açma ile birden çok erişim belirteci edinmenizi sağlar. Bu özellik, bir kullanıcının yeniden kimlik doğrulamasını gerektirmeden bir veya daha fazla erişim belirteci almanıza olanak tanır.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Bir veya birden çok erişim belirteci alma.
  • API çağırma

Önkoşullar

Bir veya birden çok erişim belirteci alma

MSAL yerel kimlik doğrulama SDK'sı birden çok erişim belirtecini depolayabilir. Oturum açtıktan sonra, işlevini kullanarak getAccessToken(scope:) ve vermek istediğiniz yeni erişim belirtecinin kapsamlarını belirterek bir erişim belirteci alabilirsiniz.

  1. Aşağıdaki kod parçacığını kullanarak bir DIZI API kapsamı için değerleri bildirin ve ayarlayın:

    let protectedAPIUrl1: String? = nil
    let protectedAPIUrl2: String? = nil 
    let protectedAPIScopes1: [String] = []
    let protectedAPIScopes2: [String] = []
    
    var accessTokenAPI1: String?
    var accessTokenAPI2: String?
    
    • İlk web API'nizin URL'si ile başlatın protectedAPIUrl1 .
    • İkinci web API'nizin URL'si ile başlatın protectedAPIUrl2 .
    • gibi ["api://<Resource_App_ID>/ToDoList.Read", "api://<Resource_App_ID>/ToDoList.ReadWrite"]ilk API'nizin kapsamlarıyla tanımlayınprotectedAPIScopes1.
    • İkinci API'nizin kapsamlarıyla tanımlama protectedAPIScopes2 , benzeri protectedAPIScopes1.
    • İsteğe bağlı dize değişkenlerini ve accessTokenAPI2bildirinaccessTokenAPI1.
  2. Aşağıdaki kod parçacığını kullanarak kullanıcı oturum açar:

    @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)
    }
    

    signInPressed yöntemi, oturum açma düğmesine basma işlemini işler. E-posta ve parola alanlarının doldurulup doldurulmadığını denetler. Herhangi biri boşsa , "E-posta veya parola ayarlanmadı" ifadesini gösterir. Her iki alan da doldurulmuşsa, e-postayı günlüğe kaydeder, "Oturum aç..." görüntüler ve sağlanan e-posta ve parola ile yöntemini nativeAuth kullanarak signIn oturum açmayı başlatır. Sdk, hiçbir kapsam belirtilmediğinden varsayılan OIDC kapsamları (openid, offline_access, profil) için geçerli bir belirteç alır.

  3. Aşağıdaki kod parçacığını kullanarak bir veya birden çok erişim belirteci alın:

    @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)
        }
    }
    

    ve protectedApi2Pressed yöntemleri, protectedApi1Pressed iki farklı kapsam kümesi için erişim belirteçleri alma işlemini yönetir. İlk olarak her API'nin URL'lerinin ve kapsamlarının düzgün yapılandırıldığından emin olurlar. API için erişim belirteci zaten varsa, API'ye doğrudan erişir. Aksi takdirde, bir erişim belirteci isteğinde bulunur ve devam eden belirteç alma işlemi hakkında kullanıcıyı bilgilendirilir.

    ve protectedAPIScopes2öğesine erişim belirteci atamak için protectedAPIScopes1 aşağıdaki kod parçacığını kullanın:

    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")")
    }
    

    yöntemi, onAccessTokenRetrieveCompleted erişim belirtecini konsola yazdırır. Ardından sonucun kapsamlarına eklenip eklenmediğini ve kullanılabilir olup olmadığını denetlerprotectedAPIScopes1; varsa URL ve belirteçle ayarlar accessTokenAPI1 ve çağırıraccessProtectedAPI.protectedAPIUrl1 ve protectedAPIUrl2için protectedAPIScopes2 benzer bir denetim gerçekleştirir ve koşulların karşılanması durumunda API çağrısını güncelleştirir accessTokenAPI2 ve yapar. Son olarak yöntemi oturum açma durumu, kapsamları ve erişim belirtecini içeren bir ileti görüntüler ve kullanıcı arabirimini güncelleştirir.

    yöntemi, onAccessTokenRetrieveError erişim belirteci alma hatasının açıklamasını içeren bir hata iletisi veya açıklama sağlanmazsa varsayılan bir ileti görüntüler.

API çağırma

BIR API'yi çağırmak için aşağıdaki kod parçacıklarını kullanın:

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()
}

yöntemi, accessProtectedAPI sağlanan erişim belirtecini kullanarak belirtilen API uç noktasına bir GET isteği gönderir. İsteği Yetkilendirme üst bilgisindeki belirteçle yapılandırıyor. Başarılı bir yanıt aldığında (HTTP durum kodu 200-299), JSON verilerini seri durumdan çıkartır ve kullanıcı arabirimini HTTP durum kodu ve yanıt gövdesiyle güncelleştirir. İstek veya yanıt işleme sırasında bir hata oluşursa, kullanıcı arabiriminde hata iletisini görüntüler. Bu yöntem, sağlanan URL'ye ve erişim belirtecine bağlı olarak API 1 veya API 2'ye erişim sağlar.