3

これは、ユーザー名/パスワードを必要とするHTTPSサーバーからJSONを取得しようとしているクライアント/サーバーを処理する必要があった最初のアプリであるため、AFNetworkingを機能させるために頭を悩ませています。私はそれをアプリにいくらか接続しましたが、基本認証の問題であると私が調べた401エラーをスローし続けます。

私は基本的にAFNetworkingからTwitterの例を取り、それを自分のプロジェクトに適合させました。AFHTTPClientのサブクラスで、initWithBaseURLに別の行を追加していますが、それでもエラーがスローされます。私が追加している行は、setAuthorizationHeaderWithUsernameです。

- (id)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (!self) {
    return nil;
}

[self registerHTTPOperationClass:[AFJSONRequestOperation class]];

// Accept HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
[self setDefaultHeader:@"Accept" value:@"application/json"];
[self setAuthorizationHeaderWithUsername:@"myusername" password:@"my password"];

return self;
}
4

2 に答える 2

5

AFNetworkingでNTLM認証を使用しようとしている場合は、次のことを試すことができます。

AFNetworkingは、一般的な認証の課題に対してブロックベースの応答を提供することにより、NTLM認証(または基本的に任意の認証方法)をサポートします。

これがコード例です(がなどoperationであるAFHTTPRequestOperationと仮定しますAFJSONRequestOperation)。操作を開始する前に、認証チャレンジブロックを次のように設定します。

[operation setAuthenticationChallengeBlock:
 ^( NSURLConnection* connection, NSURLAuthenticationChallenge* challenge )
{
   if( [[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodNTLM )
   {
      if( [challenge previousFailureCount] > 0 )
      {
         // Avoid too many failed authentication attempts which could lock out the user
         [[challenge sender] cancelAuthenticationChallenge:challenge];
      }
      else
      {
         [[challenge sender] useCredential:[NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession] forAuthenticationChallenge:challenge];
      }
   }
   else
   {
      // Authenticate in other ways than NTLM if desired or cancel the auth like this:
      [[challenge sender] cancelAuthenticationChallenge:challenge];
   }
}];

通常どおり操作を開始またはキューに入れれば、うまくいくはずです。

これは基本的に、ウェイン・ハートマンが彼のブログでAFNetworkingに適用した方法であると説明しています。

于 2013-01-10T14:10:58.123 に答える
4

受け入れられた回答の所有者が言及した方法は見つかりませんでしsetAuthenticationChallengeBlock:た(新しいバージョンで削除された可能性がありますか?)が、以下に示すように、NTLM認証用の非ブロックベースのソリューションを思いつきました。(実際にはSwiftで記述されていますが、Objective Cに変換しても問題はありません)AFHTTPRequestOperationインスタンスに資格情報オブジェクトを設定するだけです。

var reqSerializer:AFHTTPRequestSerializer = AFHTTPRequestSerializer()
var request = reqSerializer.requestWithMethod("GET", URLString: "<URL>", parameters: nil, error: nil)  
var oper = AFHTTPRequestOperation(request: request)

var respSerializer = AFXMLParserResponseSerializer()
oper.responseSerializer = respSerializer

var creds:NSURLCredential = NSURLCredential(user: "<DOMAIN\\USER>", password: "<PASSWORD>", persistence: NSURLCredentialPersistence.None)
oper.credential = creds

oper.setCompletionBlockWithSuccess({ (oper:AFHTTPRequestOperation!, obj:AnyObject!) -> Void in
        //handle success

    }, failure: { (oper:AFHTTPRequestOperation!, err:NSError!) -> Void in
        //handle failure
})

oper.start()
于 2014-09-23T10:40:42.430 に答える