Alamofireがサーバーにリクエストを送信するときに不正な認証ヘッダーを使用している場合、この問題が発生します。iOS Alamofire Incorrect Authorization Header
初めてユーザー名とパスワードを使用するとすべて正常に動作します。その後、ユーザー名とパスワードをすばやく変更して別のユーザーとして要求を再試行すると、完全に失敗します。 iOSコンソールでHTTPヘッダーを印刷するときは毎回正しいです。しかし、私のサーバーがヘッダーを印刷するときには、iOSコンソールに印刷したヘッダーとは異なります。
ユーザーを変更する前に数分待つとうまくいくようです。しかし、1分以内に行うと、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
の値が依然としてあります。したがって、サーバーは、第2のユーザーとしてログインしていても、第1のユーザーの情報を返します。
したがって、base64LoginString
の印刷とサーバーが要求を受信するまでの間に何かが失敗します。それはヘッダーや何かをキャッシュするのとほぼ同じですが、それはまったく意味がありません。
参考までに、私はNode、Express、およびPassport.jsを使用してWebリクエストを処理し、バックエンドで認証しています。助けてくれる情報があれば教えてください。
私はAlamofireを使用していないので、私は本当に速いあなたの質問をお読みください。 http://stackoverflow.com/questions/32893800/alamofire-ignore-cache-control-headersとドキュメントを読んでいれば、** 'Response Caching ** レスポンスキャッシュは、次のように処理されます。 URLCacheによるシステムフレームワークレベル。これは、複合メモリ内およびディスク上のキャッシュを提供し、メモリ内とディスク上の両方のサイズを操作できます。 デフォルトでは、Alamofireは共有URLCacheを利用します。それをカスタマイズするには、「セッションマネージャの設定」セクションを参照してください。 –
またはこれ:http://stackoverflow.com/questions/32199494/how-to-disable-caching-in-alamofire –
ええ、私はそれが 'sessionManager.session.configuration.requestCachePolicy = .reloadIgnoringLocalCacheData'がやっていたものだと思っていました。または 'URLCache.shared.removeAllCachedResponses()' –