Как передать токен доступа в ios с alamofire - PullRequest
0 голосов
/ 13 марта 2019

Я получаю токен доступа из API при входе в систему, но я не знаю, как передать токен через весь интерфейс, который должен содержать этот токен, для извлечения данных из API на основе токена пользователя.

Здесь View Controller для входа в систему

@IBAction func login(_ sender: UIButton) {
        //getting the username and password
        let parameters: Parameters=[
        "name":userText.text!,
        "password":passwordTet.text!
        ]
        var token = String()// global variable
        let headers = [
            "Authorization" : String(format: "Bearer: @%", token)
        ]
    
        Alamofire.request(URL_USER_LOGIN, method: .post, parameters: parameters, headers: headers).responseJSON
            {
                response in
        print(response)

                //getting the json value from the server
                        if let result = response.result.value {
                            let jsonData = result as! NSDictionary

                           // if there is no error
                            if((!(jsonData.value(forKey: "error") != nil) )){
                                // if there is a token
                                token = (jsonData.object(forKey: "access_token") as! String?)!
                                print(token)
                                                
                                       //switching the screen
                      let Home_AdminViewController = self.storyboard?.instantiateViewController(withIdentifier: "TabBarViewController") as! TabBarViewController
                    self.navigationController?.pushViewController(Home_AdminViewController, animated: true)
                          self.dismiss(animated: false, completion: nil)
                        }
                            else {
                                //error message in case of invalid credential
                                self.LabelMessage.text = "Invalid username or password"
                            }

                }
        }

и вот пример контроллера представления должен использовать тот же токен, который генерируется при входе в систему для получения данных пользователя из API, но я не знаю, как это сделать, вы можетепомогите пожалуйста?

var newOfferArray = [AnyObject]()
    override func viewDidLoad() {
        super.viewDidLoad()
        //Send request to API
        Alamofire.request("http://127.0.0.1:8000/api/offers").responseJSON { response in

            print(response)
            let result = response.result
            if let dict  = result.value  as? Dictionary<String,AnyObject>{
            if let innerdict = dict ["data"] {
                    self.newOfferArray = innerdict as! [AnyObject]
                    print(self.newOfferArray)
                    self.tableView.reloadData()
                }
            }
        }
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return newOfferArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath ) as? Child1TableViewCell
        if self.newOfferArray.count > 0{
            //variables
            let name = self.newOfferArray[indexPath.row]
            cell?.Namelabel.text = name["name"] as? String

        }
       

        return cell!
    }

Ответы [ 4 ]

0 голосов
/ 19 марта 2019

спасибо всем!Я получил ответ, используя библиотеку Keychainwrapper https://github.com/jrendel/SwiftKeychainWrapper

. Сначала я сохраняю токен доступа в запросе на вход в систему, затем могу использовать где угодно.

0 голосов
/ 14 марта 2019

Вы можете попробовать код ниже

let auth = "your token"
let authData = auth.data(using: String.Encoding.utf8)!
let base64EncodedCredential = authData.base64EncodedString()
let authString = "Basic \(base64EncodedCredential)"
let authorization = ["Authorization" : authString]

Сделать верхний код константным как глобальный в некотором файле

Alamofire.request(url, method: .get, parameters: para, encoding: URLEncoding.default, headers: authorization).responseSwiftyJSON { (result) in
      print("url:=",url)
      print("parameter:=",para)
      print("response:=",result.value ?? "nil")
      completion(result.result)
}
0 голосов
/ 17 марта 2019

Вы можете проверить документы в Alamofire о RequestAdatper , я думаю, это то, что вы хотите.

class AccessTokenAdapter: RequestAdapter {
    private let accessToken: String

    init(accessToken: String) {
        self.accessToken = accessToken
    }

    func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
        var urlRequest = urlRequest

        if let urlString = urlRequest.url?.absoluteString, urlString.hasPrefix("https://httpbin.org") {
            urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")
        }

        return urlRequest
    }
}
let sessionManager = SessionManager()
sessionManager.adapter = AccessTokenAdapter(accessToken: "1234")

sessionManager.request("https://httpbin.org/get")
0 голосов
/ 13 марта 2019

Вы можете создать простую структуру со статическими переменными, такими как:

struct Credentials {
    static var token: String?
    static var refreshToken: String?
}

Это, вы можете вызвать: Credentials.token или Credentials.refreshToken

Или просто, в пустом файле swift, добавьте эти переменные без какого-либо класса или структуры:

var token: String?
var refreshToken: String?

В этом случае вы можете получить к нему прямой доступ token в любом файле

...