3

我基本上使用 RestKitRKClient并执行get请求。我的系统使用用户名/密码/帐户来验证用户。它只是用于用户名/密码的 httpbasic,并且该帐户只是一个子域。

我遇到的问题是,如果我执行以下操作:

  1. 使用正确的信息登录(然后下载应用程序的所有数据)
  2. 重置数据(这会删除我所有的核心数据对象,我还将共享 RKClient 的用户名和密码设置为空白)
  3. 输入错误的用户名/密码,但输入正确的帐户,然后它将下载数据,就好像一切都正确一样。

我在设置用户名和密码之前和之后放置了puts,我可以看到它被更改为不正确的数据。而且我已将缓存设置为RKRequestCachePolicyNone(在共享客户端和 RKRequest 实例上)。

返回的请求说它不是从缓存中提取的。当我尝试使用 curl 在终端中复制问题时,我得到了正确的响应(我无法使用错误的用户名密码获取数据)。

那么为什么/如何将 RestKit 得到正确的响应呢?它正在访问服务器并返回 200 响应。

示例代码:

- (void)startDownload {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSLog(@"username and password before (%@,%@)",[RKClient sharedClient].username,[RKClient sharedClient].password);
    [RKClient sharedClient].username = self.login;
    [RKClient sharedClient].password = self.password;

    NSLog(@"username and password after (%@,%@)",[RKClient sharedClient].username,[RKClient sharedClient].password);

    NSString *base = [NSString stringWithFormat:@"http://%@.%@api",self.accountName,[defaults stringForKey:@"myURL"]];

    [[RKClient sharedClient] setBaseURL:base];
    [[RKClient sharedClient] setAuthenticationType:RKRequestAuthenticationTypeHTTPBasic];

    [[RKClient sharedClient] setCachePolicy:RKRequestCachePolicyNone];

    RKRequest *request = [[RKClient sharedClient] get:@"/verify.json" delegate:self];

    [request setCachePolicy:RKRequestCachePolicyNone];
}

更新

我还注意到,如果我在第一次登录时输入了错误的密码,它就会以失败的形式返回。如果我然后更正密码,之后它总是会失败。

4

1 回答 1

1

显然 Restkit 存储了某种 cookie 用于身份验证。就我而言,只要用户名保持不变,我就可以注销并使用错误的密码重新登录。

就我而言,我可以通过以下方式解决问题:

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in cookieStorage.cookies)
{
    [cookieStorage deleteCookie:cookie];
}

这摆脱了所有存储的cookie。我希望这也能解决您的问题。

于 2013-07-03T13:55:02.750 回答