Sabotter for iPhoneのアップデートに向けてTwitterのOAuth認証の部分の実装をどうするか検討していて。
Google Code Archive - Long-term storage for Google Code Project Hosting.にあるライブラリだとなんだか巨大すぎて、もっと軽く扱えるもの無いのかなーとhttp://dev.twitter.com/pages/oauth_libraries#objectivecをみてたらこんなのがあるらしい。
atebits / OAuthCore — Bitbucket
たったの6ファイル! これだけでOAuthのための基本的なことはできるようだ。試しにxAuthでtokenを取得してそれを使ってTweetする、というのを書いてみた。簡単にするため非同期じゃなくHTTPリクエスト処理してます
#import "Hoge.h" #import "OAuthCore.h" #import "OAuth+Additions.h" #define CONSUMER_KEY @"***************************" #define CONSUMER_KEY_SECRET @"***************************" @implementation Hoge + (void)authenticateAndTweet:(NSString *)status username:(NSString *)username password:(NSString *)password { // xAuth NSData *xauth_response = [Hoge request:[NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"] method:@"POST" body:[[NSString stringWithFormat:@"x_auth_username=%@&x_auth_password=%@&x_auth_mode=client_auth", username, password] dataUsingEncoding:NSUTF8StringEncoding] oauth_token:@"" oauth_token_secret:@""]; NSDictionary *dict = [NSURL ab_parseURLQueryString:[[[NSString alloc] initWithData:xauth_response encoding:NSUTF8StringEncoding] autorelease]]; NSString *oauth_token = [dict objectForKey:@"oauth_token"]; NSString *oauth_token_secret = [dict objectForKey:@"oauth_token_secret"]; // xAuthで得たtokenを利用してTweet NSData *tweet_response = [Hoge request:[NSURL URLWithString:@"http://api.twitter.com/1/statuses/update.json"] method:@"POST" body:[[NSString stringWithFormat:@"status=%@", status] dataUsingEncoding:NSUTF8StringEncoding] oauth_token:oauth_token oauth_token_secret:oauth_token_secret]; NSLog(@"response: %@", [[[NSString alloc] initWithData:tweet_response encoding:NSUTF8StringEncoding] autorelease]); } + (NSData *)request:(NSURL *)url method:(NSString *)method body:(NSData *)body oauth_token:(NSString *)oauth_token oauth_token_secret:(NSString *)oauth_token_secret { NSString *header = OAuthorizationHeader(url, method, body, CONSUMER_KEY, CONSUMER_KEY_SECRET, oauth_token, oauth_token_secret); NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:method]; [request setValue:header forHTTPHeaderField:@"Authorization"]; [request setHTTPBody:body]; NSURLResponse *response = nil; NSError *error = nil; return [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; } @end
ちゃんとTweetできた!(もちろんxAuthはメールで申請済み)
うーん、これはお手軽でいいなぁ。