gpt4 book ai didi

ios - URLSession 凭据缓存允许使用不正确的凭据进行身份验证

转载 作者:行者123 更新时间:2023-11-28 07:32:38 33 4
gpt4 key购买 nike

我正在尝试在我的 iOS 应用程序中与我公司的 API 进行通信。我使用的是标准 URLSession。

API 会自动负载平衡并重定向到不同的服务器,因此我实现了处理重定向的 URLSessionDelegate 和 URLSessionTaskDelegate 方法。

当我最初登录时,我将从 http://our.api.com 重定向至 http://our1.api.com或具有不同服务器编号的其他版本的 API。我第一次使用 http://our1.api.com 进行身份验证它将尊重传入的授权 header 和挑战的 URLCredential。但是,如果我尝试使用已知的错误凭据再次针对同一 API 进行身份验证,则会使用旧的 URLCredential,并且我能够在我不应该进入的时候进入 API。

有没有办法强制 URLSession 从不使用缓存的 URLCredential,或者以其他方式清除缓存的 URLCredential?

创建 URLSession

let config = URLSessionConfiguration.ephemeral
config.httpAdditionalHeaders = ["Accept":"application/xml",
"Accept-Language":"en",
"Content-Type":"application/xml"]
config.requestCachePolicy = .reloadIgnoringLocalCacheData
config.urlCache = nil
self.urlSession = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)

调用API

var request = URLRequest(url: thePreRedirectedUrl)
request.httpMethod = "GET"
request.addValue("Basic username:password", forHTTPHeaderField: "Authorization")

let task = urlSession?.dataTask(with: request, completionHandler: { (data, response, error) in
// pass endpoint results to completion block
completionBlock(data, response, error)
})

// run the task
if let task = task {
task.resume()
}

URLSessionDelegate 和 URLSessionTaskDelegate

extension ApiManager: URLSessionDelegate, URLSessionTaskDelegate {

func urlSession(_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

if challenge.previousFailureCount == 0 {
completionHandler(.useCredential, URLCredential(user: username, password: password, persistence: .none))

} else {
completionHandler(.performDefaultHandling, nil)
}
}

func urlSession(_ session: URLSession,
task: URLSessionTask,
willPerformHTTPRedirection response: HTTPURLResponse,
newRequest request: URLRequest,
completionHandler: @escaping (URLRequest?) -> Void) {

var newRequest = URLRequest(url: request.url!)
newRequest.addValue("Basic username:password", forHTTPHeaderField: "Authorization")
newRequest.httpMethod = task.originalRequest?.httpMethod
newRequest.httpBody = task.originalRequest?.httpBody
completionHandler(newRequest)
}
}

最佳答案

最可靠的方法是从用户 (macOS) 或应用 (iOS) 钥匙串(keychain)中删除凭证。

参见 Updating and Deleting Keychain Items在 Apple 的开发者网站上了解详细信息,但基本上:

NSDictionary *matchingDictionary = @{
kSecClass: kSecClassInternetPassword,
kSecAttrSecurityDomain: @"example.com" // <-- This may not be quite the
// right format for the domain.
};
SecItemDelete((__bridge CFDictionaryRef) matchingDictionary);

关于ios - URLSession 凭据缓存允许使用不正确的凭据进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54245081/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com