我的应用程序从使用基于表单的身份验证的网站提取数据。它需要透明地对重定向做出反应,以便通过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];
}
}
问题是我没有得到401认证。重定向到登录页面后,我得到一个200。如何在发生这种情况时触发'AFURLConnection -setAuthenticationChallengeBlock:'来触发? – lidders
那么,认证回调只有在服务器发送认证应该发生的任何指示时才起作用。也许你可以使用[刚添加的重定向响应块属性](https://github.com/AFNetworking/AFNetworking/commit/d17b2998d7d7c877a3133959c97498780e064681),通过提供一个钩子来挂钩重定向。 – mattt
无论哪种方式,因为如果您有能力更改服务器后端或使用适当的API,那会让事情变得更容易。 – mattt