1

私のアプリは、フォームベースの認証を使用するWebサイトからデータを取得します。ログインページへのリダイレクトに透過的に反応し、POSTリクエストを介してリクエストされたクレデンシャルを提供する必要があります。

以前にASIHTTPREQUESTを使用してから、URLをチェックして、認証ページにリダイレクトされたかどうかを確認し、リダイレクトされた場合は、ログインフォーム変数を使用してPOSTリクエストを送信し、元のリクエストを再度作成しました。それは動作しますが、ちょっとしたハックです。

私は現在、コードをAFNetworkingに移行しており、これを実現するためのよりエレガントな方法があるかどうか疑問に思っています。おそらく、認証ヘッダーを挿入しますか?認証ページへのリダイレクトが発生したときに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];
    }
}
4

1 に答える 1

3

自分で物事を簡単にし、HTTPが提供するものを使用してください。

HTTPは、要求が成功したか(200)、または許可が必要か(401)を示すステータスコードを定義します。

共有インスタンスのAuthorized HTTPヘッダーにクレデンシャルを保存するAFHTTPClientと、以降のすべての呼び出しに対して認証されます。

または、それらがそれを行っていない場合は、AFURLConnection -setAuthenticationChallengeBlock:認証の課題に対応するために使用できます。

于 2012-05-24T17:11:18.663 に答える