エンジニアリングにはほど遠い

iPhoneアプリとかサイトとかをつくっていくブログです。

Basic認証でurlにuser,passを叩き込んだらnginxでエラーが出た件

Basic認証のurl埋め込み

Basic認証はurlにuserとpassを埋め込んでも通過できるという話があります。

http://(user):(pass)@host....

しかしそれだとnginxにて以下のエラーが出ました。

no user/password was provided for basic authentication

urlに埋め込む方法が実際どういう仕組みなのか分かってないのですが、 これだとリクエストヘッダにAuthorizationヘッダが付く訳ではないっぽいです。

認証部分を通過しているけどエラーが出たということは
ちゃんとリクエストヘッダに設定した方がいいという事なのでしょう。

AFNetworking

iOSでAFNetworkingを使ってhttp通信してたんですが、1.x系だとBasic認証の仕方が分かりませんでした。(AFHTTPClientのsetAuthorizationHeaderWithUsername:passwordでエラーが消えなかった。)
なので2.x系を使いました。ていうか2.x系を使った方がいいです。 Basic認証をする為にはリクエストを加工してくれるserializerというやつにusernameとpassをセットします。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"username" password:@"password"];
[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

ちなみにこのserializerはJSONでリクエストパラメータを送りたいならAFJSONRequestSerializerをmanager.requestSerializerにセットしないといけません。 また、JSONのパラメータを受け取りたいときはmanager.responseSerializerにAFJSONResponseSerializerをセットしないとダメです。

requestのヘッダの確認はAFNetworkActivityLoggerでやりました。めちゃ便利です。