2012-05-23 116 views
1

我的应用程序从使用基于表单的身份验证的网站提取数据。它需要透明地对重定向做出反应,以便通过POST请求提供所请求的凭证,登录页面为&。我以前用过ASIHTTPREQUEST &使用AFHTTPClient进行Cookie身份验证

然后通过检查URL的历程,看看我是否已经被重定向到&认证页面,如果这样发送的登录表单变量&然后让原始请求的POST请求再次。它可以工作,但有点破解。

我现在正在将我的代码移动到AFNetworking &想知道是否有一个更优雅的方式来实现这一点,也许注入一个auth头?当重定向到认证页面时,AFHTTPClient触发认证代理方法,然后发布表单。这里有一些伪代码:

- (void)requestFinished:(ASIHTTPRequest *)request { 
if ([Connection isAuthURL:[request url]]) 
{ 
    // If so have we just tried to login ? 
    if (requestState == requestStateSendingLoginCredentials) 
    { 
     // Login Failed - tried to login & been redirected back to login page 
     [self requestFailed:request]; 
    } 
    else 
    { 
     // We have been directed to login page after a page request 
     requestState = requestStateSendingLoginCredentials 
     [self postLoginForm:request]; 
    } 
} 
else 
{ // Not the authentication page 
    if (requestState == requestStateSendingLoginCredentials) 
    { // We must have successfully logged in 
     requestState = requestStateSuccessful; 
     // If it was a form we need to post again now were logged in. 
     if ([lastRequest isAForm]) 
     { 
      // If original request that triggered the login was a POST request 
      // we have to re-send it. 
      [self requestURL:nil]; // This will send the last request again 
      return; 
     } 
    } 
    if (requestState == requestStateSuccessful) 
    { 
     [self processResponse:request]; 
    } 
} 

回答

3

让自己变得容易并使用HTTP为您提供的东西。

HTTP定义了status codes,告诉你请求是成功的(200)还是需要授权(401)。

将您的凭据存储在您的共享AFHTTPClient实例的AuthorizedHTTP header中,并且您将对所有后续调用进行身份验证。

或者,如果那些没有这样做,您可以使用AFURLConnection -setAuthenticationChallengeBlock:来响应身份验证挑战。

+0

问题是我没有得到401认证。重定向到登录页面后,我得到一个200。如何在发生这种情况时触发'AFURLConnection -setAuthenticationChallengeBlock:'来触发? – lidders

+0

那么,认证回调只有在服务器发送认证应该发生的任何指示时才起作用。也许你可以使用[刚添加的重定向响应块属性](https://github.com/AFNetworking/AFNetworking/commit/d17b2998d7d7c877a3133959c97498780e064681),通过提供一个钩子来挂钩重定向。 – mattt

+0

无论哪种方式,因为如果您有能力更改服务器后端或使用适当的API,那会让事情变得更容易。 – mattt