Objective-Cで2Legged OAuthリクエストを行う

TwitterAPIを叩くサンプルは見つかったけど、純粋な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-CTwitter APIを使う 色々 - すぎゃーんメモ
http://d.hatena.ne.jp/sugyan/20100422/1271879805
 
jdg/oauthconsumer - GitHub
https://github.com/jdg/oauthconsumer