Моя цель - вызвать API, защищенный OAuth 2.0 с типом доступа Client Credentials. Я не обязательно интересуюсь примером кода, просто лучшая практика от кого-то с хорошим знанием архитектуры Swift. Хотя пример был бы великолепен!
Вкратце я пытаюсь реализовать следующее:
- Когда кнопка нажата, она вызывает функцию "getStock ()"
- Функция getStock () вызывает функцию getToken () в другом классе для запроса токена на предъявителя
- Сетевой вызов и токен возвращается в вызове 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()
}
}