iOS Alamofire不正确的授权标头

时间:2017-02-24 21:33:21

标签: ios authentication express alamofire

我遇到此问题,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请求和auth。如果我能提供更多信息来帮助我,请告诉我。

1 个答案:

答案 0 :(得分:2)

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

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

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