【问题标题】:How to pass access token in ios with alamofire如何使用 alamofire 在 ios 中传递访问令牌
【发布时间】:2019-08-04 15:16:14
【问题描述】:

我在登录时从 API 获取访问令牌但我不知道如何通过必须包含此令牌的所有接口传递令牌以根据用户令牌从 API 检索数据。

这里查看控制器用于登录

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

【问题讨论】:

    标签: swift xcode api jwt alamofire


    【解决方案1】:

    您可以使用静态变量创建一个简单的结构,例如:

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

    这个,你可以拨打:Credentials.tokenCredentials.refreshToken

    或者简单地说,在一个空的 swift 文件中,添加这个不带任何类或结构的变量:

    var token: String?
    var refreshToken: String?
    

    在这种情况下,您可以在任何文件中直接访问token

    【讨论】:

    • 如何在视图控制器中调用 swift 文件?访问令牌
    • 如果你使用结构体,调用它Credentials.token,如果没有,直接调用它token在任何视图控制器或其他Swift文件@Nora
    【解决方案2】:

    你可以试试下面的代码

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

    【讨论】:

      【解决方案3】:

      您可以在 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")
      

      【讨论】:

        【解决方案4】:

        谢谢大家!我使用 Keychainwrapper 库 https://github.com/jrendel/SwiftKeychainWrapper

        得到了答案

        首先我将访问令牌保存在登录请求中,然后我可以在任何地方使用。

        【讨论】:

          猜你喜欢
          • 2017-04-09
          • 1970-01-01
          • 1970-01-01
          • 2013-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-10
          • 1970-01-01
          相关资源
          最近更新 更多