【问题标题】:iOS Alamofire Incorrect Authorization HeaderiOS Alamofire 不正确的授权标头
【发布时间】:2017-07-15 21:04:21
【问题描述】:

我遇到了这个问题,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 请求和身份验证。让我知道我是否可以提供更多信息来提供帮助。

【问题讨论】:

  • 因为我不使用 Alamofire,所以我读得很快。可能是这样的:stackoverflow.com/questions/32893800/… 如果您阅读了文档:'响应缓存响应缓存由 URLCache 在系统框架级别处理。它提供了一个复合的内存和磁盘缓存,并允许您操作内存和磁盘部分的大小。默认情况下,Alamofire 利用共享的 URLCache。要对其进行自定义,请参阅会话管理器配置部分。'
  • 是的,我认为这就是 sessionManager.session.configuration.requestCachePolicy = .reloadIgnoringLocalCacheData 所做的。或URLCache.shared.removeAllCachedResponses()
  • 我不确定,因为我无法测试你的代码我不使用 alamofire,但是有很多关于它的不同示例的线程,你检查过它们并尝试了不同的建议吗?我在这里发现了一个更有趣的地方:stackoverflow.com/questions/37535432/…我认为这可能与您的经理实例化有关?
  • 缓存响应真的有意义吗?它正在访问我的服务器,并且服务器以 200 状态代码响应。即使在响应部分它也说它得到了 200 状态代码。不像 304 或类似的东西。

标签: ios authentication express alamofire


【解决方案1】:

不确定它是否与您的情况相同,但在我的情况下,缓存结果是由 cookie 引起的。通过在执行身份验证请求(例如,当用户注销时)之前删除所有 cookie 对我有用。我想这可能是您的问题,因为我正在执行登录请求的后端也使用 Node 和 Express。

您可以尝试使用此代码删除所有 cookie:

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

【讨论】:

    猜你喜欢
    • 2016-07-31
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2015-08-26
    相关资源
    最近更新 更多