gpt4 book ai didi

ios - 如何更改 NSURLSession 的凭据

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:12 25 4
gpt4 key购买 nike

我有以下问题:我正在向服务器发出请求,它使用 HTTP 基本身份验证并给我

  • 如果我不发送身份验证则为 401
  • 如果我发送无效身份验证,则返回 401
  • 一个 403 如果我发送有效 身份验证但该资源被禁止用户。

收到 401 时,我的 NSURLSession 足够友好,可以通过以下方式调用它的委托(delegate)

URLSession(
session: NSURLSession,
task: NSURLSessionTask, didReceiveChallenge
challenge: NSURLAuthenticationChallenge,
completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void)

然后我可以在其中修改发送到服务器的凭据。

但是,当收到 403 时,我遇到了问题。从那里我无法让 session 使用除用于获取 403 的凭据之外的任何其他凭据。在 403 上,不询问委托(delegate)(没关系,它不是 401),那么我如何控制哪些凭据是以后派那个保护空间?即使手动清空共享的 NSURLCredentialStorage 和/或直接在那里设置正确的凭据也无济于事:

let credential = NSURLCredential(user: username, password: password, persistence: .ForSession)
let protectionSpace = NSURLProtectionSpace(
host: self.host,
port: self.apiRootURL.port!.integerValue,
protocol: self.apiRootURL.scheme!,
realm: "MyRealm",
authenticationMethod: NSURLAuthenticationMethodHTTPBasic)
NSURLCredentialStorage.sharedCredentialStorage().setDefaultCredential(credential, forProtectionSpace: protectionSpace)

在这次调用之后,正确的凭据是 NSURLCredentialStorage 中唯一列出的凭据 - 但下一次对服务器的调用仍将包含旧凭据,这将不可避免地导致另一个 403。

即使使用 reset(completionHandler: @escaping () -> Void) 方法重置 session 也无济于事。

TLDR;我如何更改 NSURLSession 在给定保护域成功使用后继续使用的凭据?

最佳答案

您收到 403 响应消息,然后要么

  • 发出注销 URL 请求,然后发出登录 URL 请求。
  • 始终防止将凭据存储在凭据存储中,以便您始终收到回叫。
  • 在 403 之后删除现有凭据以强制回调。

我推荐第二种或第三种方法,具体取决于哪种方法平均请求较少。为避免持久性,传递 NSURLCredentialPersistenceNone 或 Swift 等价物,而不是告诉它在 session 期间持续存在。要删除凭据,请调用 removeCredential:forProtectionSpace:options:

根据您的应用设计和服务器设计,还有其他几种可能可行的方法:

  • 将正确的凭证预先添加到钥匙串(keychain)/凭证存储中。警告:只有一个钥匙串(keychain)支持它,所以如果您有多个需要来自不同帐户的同时请求,这不是一个好方法,因为您无法控制为给定请求发送哪个凭据。
  • 对需要以不同用户身份进行身份验证的事物使用不同的身份验证领域。

关于ios - 如何更改 NSURLSession 的凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40172401/

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