October 21, 2024
Chicago 12, Melborne City, USA
security

Securely using API Keys in SwiftUI iOS


Hello I’m trying to not save my API keys in my SwiftUI code and instead get these codes from my backend server for security from hacking. The class and code below for APIKeyHandler successfully pulls the two API keys from the backend server and prints them to screen. However when I try to access IS_API and AS_API they are returning empty strings

import Foundation
import SwiftUI

class APIKeyHandler: ObservableObject {
    @EnvironmentObject var gloVars: GlobalVars
    private let backendtUrl = URL(string: "https://test.net")!
    var IS_API: String = ""
    var AS_API: String = ""
    
    func getAPIKeys() {
            let url = backendtUrl.appendingPathComponent("get-my-apis")
            var request = URLRequest(url: url)
            request.httpMethod = "POST"
            let task = URLSession.shared.dataTask(with: request, completionHandler: { [weak self] (data, response, error) in
                guard let data = data,
                      let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String : Any],
                      let asin = json["asin_key"] as? String,
                      let isbn = json["isbndb_key"] as? String,
                      let self = self else {
                        print("Failed to retrieve api keys")
                    
                    return
                }
                
                self.IS_API = isbn
                self.AS_API = asin
                print("IS_API ", self.IS_API)
                print("AS_API ", self.AS_API)
            })
            task.resume()
        }
}

Below is the partial code from the view where I try and access IS_API from the APIKeyHandler and it returns an empty string

struct SelectFavoriteBookView: View {
    @StateObject var apiModel = APIKeyHandler()

 func fetchAPIData() {
        isbndbBookURL = isbndbBookURL1 + searchTextTitle + isbndbBookURL2
        
        print("apiModel.IS_API = ", apiModel.IS_API)
        let headers: HTTPHeaders =  [
            "accept": "application/json",
            "Authorization": "\(apiModel.IS_API)"
        ]
              AF.request(isbndbBookURL, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers, interceptor: nil)
                .response{ resp in
                    switch resp.result{
                    case .success(let data):
                        do{
                            let jsonData = try JSONDecoder().decode(BookDataStore.self, from: data!)
                            //print(jsonData)
                            books = jsonData.books
                        } catch {
                            print(String(describing: error))
                        }
                    case .failure(let error):
                        print(String(describing: error))
                    }
                } //end response

        } //end fetch API



You need to sign in to view this answers

Leave feedback about this

  • Quality
  • Price
  • Service

PROS

+
Add Field

CONS

+
Add Field
Choose Image
Choose Video