AFNetworking 2.0:凭据未在前一次请求的 30 秒内发送到身份验证

Posted

技术标签:

【中文标题】AFNetworking 2.0:凭据未在前一次请求的 30 秒内发送到身份验证【英文标题】:AFNetworking 2.0: credentials not sent to authentication within 30 seconds of previous request 【发布时间】:2014-06-18 12:19:23 【问题描述】:

我正在使用AFHTTPRequestOperationManager 从我们的服务器获取一些数据。服务器使用基本身份验证。

当用户登录我们的应用程序时,我将凭据设置如下:

manager.credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistenceForSession];

然后我提出这样的请求:

[manager GET:address parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 
    // ...
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    // ...
];

当我发出请求时,NSURLConnectionDelegate 的方法 connection:willSendRequestForAuthenticationChallenge: 被调用(该方法在 AFURLConnectionOperation 中实现)。

当用户退出应用程序并再次登录时,我再次从用户输入设置凭据。但是,如果这发生在上一个成功请求的 30 秒内,则不会将凭据发送到身份验证(不会调用connection:willSendRequestForAuthenticationChallenge:)。这意味着即使新凭据不正确,用户也可以注销然后显然登录,因为它们从未被检查过。

如果我等待至少 30 秒,则似乎没有问题(即检查凭据并收到 401 错误)。

当用户退出时我是否需要以某种方式清除凭据,还是我做错了?

【问题讨论】:

我刚刚遇到了同样的问题,请问您在此期间找到了解决方案吗? 【参考方案1】:

我遇到了完全相同的问题,发现与 AFNetworking 的 AFHTTPRequestOperationManager 的方法 shouldUseCredentialStorage 存在连接,该方法默认为 YES。 由于我没有找到在注销时清除凭据的方法,所以我现在所做的只是完全禁用 credentialStorage,如下所示:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.shouldUseCredentialStorage = NO;

不确定这是否是最好的解决方案,但对我有用。

【讨论】:

以上是关于AFNetworking 2.0:凭据未在前一次请求的 30 秒内发送到身份验证的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 未在块内同步返回数据

带有凭据的 AFNetworking 上传任务(HTTP 基本身份验证)

从 AFNetworking 1.3 迁移到 AFNetworking 2.0 的问题

AFNetworking 2.0 JSON 解析

AFNetworking 2.0 对现有项目的更新

AfNetworking 2.0 发布问题