TwitterのAPIを叩くサンプルは見つかったけど、純粋な2Legged OAuthのやり方が見つからなかった。
だからメモ。
2Legged OAuthリクエスト
OAuthConsumerライブラリを使う。
OAMutableURLRequestは、NSMutableURLRequestを継承したクラス。
OAConsumerは、コンシューマの情報を持つオブジェクト。
全てのリクエスト情報をセットし終えた所で、prepareメソッドを実行。
そうするとAuthorizationヘッダが追加される。
ソース
#import "OAMutableURLRequest.h" #import "OAConsumer.h" - (void)oauth_request { NSURL *url = [NSURL URLWithString:@"http://g-storage.appspot.com/storage/"]; OAConsumer *consumer = [[[OAConsumer alloc] initWithKey:@"YOUR-CONSUMER-KEY" secret:@"YOUR-CONSUMER-SECRET"] autorelease]; OAMutableURLRequest *request = [[[OAMutableURLRequest alloc] initWithURL:url consumer:consumer token:nil realm:nil signatureProvider:nil] autorelease]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[@"format=json" dataUsingEncoding:NSUTF8StringEncoding]]; [request prepare]; NSURLResponse *response; NSError *error = nil; NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; NSLog(@"result: %@", [[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding] autorelease]); NSLog(@"error: %@", error); }
OARequestParameter
URLエンコード済みの長いクエリを文字列で指定するのはめんどくさい。
OAMutableURLRequestのsetParametersメソッドが使いやすい。
OARequestParameterの配列をsetParametersに渡すと、URLエンコードしてsetHTTPBodyしてくれる。
OARequestParameterは、KeyとValueを持つオブジェクト。
NSDictionaryでいいのに、と思ってしまうのは野暮なのだろうか…?
自分なら、NSDictionaryにURLエンコードしてNSStringを返すメソッドを追加するかな、と。
NSDictionaryだと同一キーの扱いが変わるけど、OAuth的にはどうなるべきなのかな。
Signatureを生成する時のソート方法は、キーしか関係なかったような気がするけど。
ソース
#import "OAMutableURLRequest.h" #import "OAConsumer.h" #import "OARequestParameter.h" - (void)oauth_request { NSURL *url = [NSURL URLWithString:@"http://g-storage.appspot.com/storage/"]; OAConsumer *consumer = [[[OAConsumer alloc] initWithKey:@"YOUR-CONSUMER-KEY" secret:@"YOUR-CONSUMER-SECRET"] autorelease]; OAMutableURLRequest *request = [[[OAMutableURLRequest alloc] initWithURL:url consumer:consumer token:nil realm:nil signatureProvider:nil] autorelease]; NSMutableArray *params = [NSMutableArray array]; [params addObject:[OARequestParameter requestParameter:@"format" value:@"json"]]; [request setHTTPMethod:@"POST"]; [request setParameters:params]; [request prepare]; NSURLResponse *response; NSError *error = nil; NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; NSLog(@"result: %@", [[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding] autorelease]); NSLog(@"error: %@", error); }
必要なファイル
必要なファイルだけ入れて、あとは削除。
これですっきり。
Categories/*
Cryoto/*
OAConsumer.h
OAConsumer.m
OAHMAC_SHA1SignatureProvider.h
OAHMAC_SHA1SignatureProvider.m
OAMutableURLRequest.h
OAMutableURLRequest.m
OARequestParameter.h
OARequestParameter.m
OASignatureProviding.h
OAToken.h
OAToken.m
参考URL
Objective-CでTwitter APIを使う 色々 - すぎゃーんメモ
http://d.hatena.ne.jp/sugyan/20100422/1271879805
jdg/oauthconsumer - GitHub
https://github.com/jdg/oauthconsumer