Вызов защищенного API с использованием учетных данных Swift и клиента - PullRequest
0 голосов
/ 08 февраля 2020

Моя цель - вызвать API, защищенный OAuth 2.0 с типом доступа Client Credentials. Я не обязательно интересуюсь примером кода, просто лучшая практика от кого-то с хорошим знанием архитектуры Swift. Хотя пример был бы великолепен!

Вкратце я пытаюсь реализовать следующее:

  1. Когда кнопка нажата, она вызывает функцию "getStock ()"
  2. Функция getStock () вызывает функцию getToken () в другом классе для запроса токена на предъявителя
  3. Сетевой вызов и токен возвращается в вызове http , Как только сетевой вызов исчерпан, токен передается обратно в функцию getStock () для выполнения вызова API путем включения токена носителя в заголовок.

Я создал класс OAuthGenerator, который я может вызвать, и он успешно возвращает токен.

Моя проблема в том, что я не знаю, как вернуть токен доступа другому классу, а природа сетевого вызова означает, что мне нужно дождаться возвращенного значения, прежде чем вызов моего реального API.

Если вместо этого вы предложите использовать библиотеку Swift Networking, мне будет интересно посмотреть на это. Я посмотрел несколько, но не могу найти пример реализации с использованием учетных данных клиента.

    func getStock() {

        OAuthTokenGenerator().getToken()

        var request = URLRequest(url: URL(string: "https://myapi.com/stock)!,timeoutInterval: Double.infinity)

        request.addValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")

                 request.httpMethod = "GET"

                 URLSession.shared.dataTask(with: request) { (data, response, err) in
                 guard let data = data else { return }
                 do {
                 let stock = try
                    JSONDecoder().decode(Stock.self, from: data) // decode JSON object based on above Constructor
                         DispatchQueue.main.async { // Async make call when ready

                            self.StockLabel.text = stock.stockTotal
                            self.current_fy.text = stock.currentFYTotal
                            self.previous_fy.text = stock.previousFYTotal

                         }
                     } catch let jsonErr {
                         print("Error serializing json:", jsonErr)
                     }
                 }.resume()

     }

    @IBAction func buttonSubmit(_ sender: UIButton) {
        getStock()
    }

import Foundation

class OAuthTokenGenerator {

    func getToken() {

        let headers = ["content-type": "application/x-www-form-urlencoded"]

            let postData = NSMutableData(data: "grant_type=client_credentials".data(using: String.Encoding.utf8)!)
            postData.append("&client_id=*****************".data(using: String.Encoding.utf8)!)
            postData.append("&client_secret=*****************".data(using: String.Encoding.utf8)!)

            let apiURL = "https://example-api-token-generator.com/identity/v1/token"

            guard let url = URL(string: apiURL) else { return }
            var request = URLRequest(url: url)

            request.httpMethod = "POST"
            request.allHTTPHeaderFields = headers
            request.httpBody = postData as Data

            URLSession.shared.dataTask(with: request) { (data, response, err) in
            guard let data = data else { return }
            do {
            let token = try
            JSONDecoder().decode(Token.self, from: data) // decode JSON object based on above Constructor
                    DispatchQueue.main.async { // Async make call when ready

                        print(token.access_token)

                    }

                } catch let jsonErr {
                    print("Error serializing json:", jsonErr)
                }

            }.resume()
    }


}

1 Ответ

0 голосов
/ 08 февраля 2020

Ваш вопрос немного сбивает с толку, я полагаю, вам следует сохранить токен с базовой платформой данных перед первым запуском приложения, чтобы вы могли вспомнить его в любое время и бояться, что он всегда присутствует в приложении, поскольку значение основных данных является постоянным значение и всегда остается присутствующим, даже когда вы убиваете приложение. После сохранения каждый раз, когда вы входите в систему, вы можете вспомнить его, если вы объявляете, что если полученный токен совпадает с токеном, сохраненным в основных данных, то он вводится, в противном случае выдается предупреждение, объясняющее ошибку ...

...