2017-02-24 133 views
1

我遇到此问题,Alamofire在向我的服务器发送请求时使用不正确的授权标头。iOS Alamofire不正确的授权标头

我第一次使用用户名和密码,一切正常。然后,如果我快速更改用户名和密码,并以不同的用户身份重试请求,则完全失败。当我在iOS控制台中打印HTTP标题时,每次都是正确的。但是当我的服务器打印标题时,它与我在iOS控制台上打印的标题不同。

如果我在更改用户之前等待几分钟,它似乎工作正常。但是,如果我在一分钟内完成,iOS设备上打印的授权标题与服务器收到的不同。所以它使用的是旧授权信息而不是新授权信息。

以下是我正在使用的代码。

func reloadData() { 
    print("Reloading data!!") 
    let keychain = KeychainSwift() 

    let email: String = keychain.get("email")! 
    let password: String = keychain.get("password")! 

    URLCache.shared.removeAllCachedResponses() 

    let sessionManager = Alamofire.SessionManager.default 
    sessionManager.session.configuration.requestCachePolicy = .reloadIgnoringLocalCacheData 


    let loginString = String(format: "%@:%@", email, password) 
    let loginData = loginString.data(using: String.Encoding.utf8)! 
    let base64LoginString = loginData.base64EncodedString() 

    print(base64LoginString) 

    let headers: HTTPHeaders = ["Authorization": "Basic \(base64LoginString)"] 



    sessionManager.request("http://IPHERE:3000/api/items", headers: headers).validate().responseJSON { response in 
     switch response.result { 

     case .success(let value): 

      let json = JSON(value) 
      print("JSON: \(json)") 

      for item in json.array! { 

       let title: String? = item["title"].stringValue 
       self.titles.append(title!) 
       self.colors.append(UIColor.blue) 
      } 

      self.tableView.reloadData() 

     case .failure(let error): 
      print ("My Error") 
      print (error) 
      let alertController = UIAlertController(title: "Error", message: "Error, please try again or contact support", preferredStyle: UIAlertControllerStyle.alert) 
      let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in 
      } 
      alertController.addAction(okAction) 
      self.present(alertController, animated: true, completion: nil) 
     } 
    } 
} 

所以,如果我第一次调用这个函数,它工作正常。 base64LoginString是正确的,并匹配服务器收到的内容。如果我注销并输入了不同的用户信息,则base64LoginString与原来的正确并且是预期的不同。但是,该请求在发送到服务器时仍然具有旧的base64LoginString值,而不是新的值。因此,即使我们现在以第二个用户身份登录,服务器也会返回第一位用户的信息。

因此,在打印base64LoginString和接收请求的服务器失败之间的某处。它几乎就像缓存标题或其他东西一样,根本没有意义。

同样供参考,我使用Node,Express和Passport.js来处理后端的Web请求和身份验证。让我知道我是否可以提供更多信息来帮助您。

+0

我看了你的问题真快,因为我不使用Alamofire。它可能是这样的:http://stackoverflow.com/questions/32893800/alamofire-ignore-cache-control-headers,如果您阅读文档:**'响应缓存** 响应缓存处理系统框架级别由URLCache提供。它提供了复合内存和磁盘缓存,并允许您操纵内存和磁盘部分的大小。 默认情况下,Alamofire利用共享的URLCache。为了定制它,请参阅会话管理器配置部分。' – 2017-02-24 22:27:50

+0

或这个:http://stackoverflow.com/questions/32199494/how-to-disable-caching-in-alamofire – 2017-02-24 22:30:34

+0

是的,我认为这就是'sessionManager.session.configuration.requestCachePolicy = .reloadIgnoringLocalCacheData'正在做什么。或'URLCache.shared.removeAllCachedResponses()' –

回答

0

不知道是否它的相同情况,但在我的情况下,缓存结果是由cookie引起的。在执行身份验证请求(例如,用户退出时)之前,删除所有的Cookie为我工作。我想这可能是你的问题,因为我在做登录请求的后端也使用Node和Express。

你可以试试这个代码删除所有cookie:

let cookieStore = HTTPCookieStorage.shared 
for cookie in cookieStore.cookies ?? [] { 
    cookieStore.deleteCookie(cookie) 
}