最初のiOSアプリがやっと完成しそう(その2):OAuth認証
開始までの経緯
最初のiOSアプリ習作を、ブログサービス「はてなダイヤリー」のネイティブアプリとしましたが、Webサービスをアプリから使うには、ユーザ認証する必要があります。
はてなでは、いくつかの認証方法が提供されており、そのなかで、OAuth認証がおもに推奨されているようでした。
はてな OAuth - Hatena Developer Center
はてなに限らず、Web界隈で、OAuth認証が使われているサイトをよく見かけるようになっていましたので、まず手始めに、これを利用できるようにするところから始めました。
解説ページを読んでいったのですが、そもそもOAuth認証について全く知らなかったので、よく理解できませんでした。
ま、理解できずとも、どこかにiOS用のOAuthライブラリが転がっていて、それを拾ってきてブラックボックス的にアプリから使えばすむだろうと、安易に考えていました。
iOS用OAuthライブラリを探してきて試す
上記のはてなOAuth解説ページには、PerlとRubyのサンプルソースは載っていましたが、Objective-C用はありませんでした。
しかたなく、ネットで、Objective-Cで書かれたOAuthライブラリを探して、まずこれを見つけました。
他でも参照、利用されていたので、これを試しましたが、xcodeでコンパイルが通らないとか(xcodeの使い方に慣れてないだけ?)、OS X用APIが使われており、iOSでは使えないんじゃないか?とわかった、などで、すんなりいきませんでした。
必要なとこだけ抜き出して使おうと考えましたが、多数のクラスを有する、かなりマッシブなソースだったので、objective-cに不慣れなこともあり、断念。
その他のライブラリをいろいろ漁って試しましたが、どれも高機能で必要機能に絞って使いこなせないというか、動かないというか。
もっと少ないクラスで、最低限の機能に絞ったライブラリを探したところ、OAuthCoreというのを見つけ、これが解りやすそうだったのでDL。(githubではないリポジトリにあり、これを使う道草というオマケ付き。)
はてなダイアリーOAuth認証に使えるように修正
ただ単にライブラリをDLして利用するだけでは、うまくいかず、OAuthの仕組みを理解する事が早道だとおもい、結局、OAuthの仕様の資料(RFC)を読みました。
また、はてなダイアリーで動作実績のある、はてなDeveloperサイトのRubyサンプルコードを動かして、iOSプログラムと比較など試行錯誤し、iOSのコードを書いていきました。
そうしていくうち、DLしたOAuthCoreのライブラリには、はてなのOAuth認証に使うには、仕様に不足あることがわかり(*1)、最終的にこの辺りを修正して、OAuth認証のライブラリを作りました。
*1 : OAuthは認証の過程で、ユーザをログインさせるサイトにリダイレクトし誘導しますが、そのリダイレクト先のURL名( = callbackURL)を、認証文字列の生成のパラメータに含める必要がある。OAuthCoreライブラリは、それが含まれていなかった。
作成したoauthライブラリをgithubのリポジトリに登録しました。
mirie0908/iOS_oauth_library · GitHub
oauth_libraryの概要
Class : OAuthCoreWrapper
概要
OAuth認証は、以下のステップで行われる。
- iOSアプリは、サービス利用先のサーバに、Temporary Credential (=Request key and secret)のhttpリクエストを送り、これを取得する。
- iOSアプリは、取得したTemporary Credentialをつかって、サービス利用先の提供する、ログイン/認証用Webページに、ユーザをリダイレクションする。
- リダイレクションされたユーザは、このWebページでログインし、iOSアプリが同サーバのサービスを利用する事を、同サーバに許可する。
- ユーザからのこの許可を受け、同サーバは、iOSアプリに対し、verificationコードを発行する。
- サービス利用を許可されたiOSアプリは、発行されたverificationコードと、(1)で取得すみのTemporary Credentialをもって、同サーバに、これ以降サービス利用の際必要なToken Credential (=Access token and secret) のhttpリクエストを送り、これを取得する。
OAuthCoreWrapperクラスは、iOSアプリから、サービス利用したいサーバのOAuth認証のため、上記(1)および(5)の、httpリクエスト作成時に必要な、OAuthヘッダを作成する。
インスタンスメソッド
- (BOOL) getOAuthHeader4TemporaryCredentialAndStoreToProperty;
- OAuthのTemporary Credential取得用httpリクエストのための、OAuthヘッダの文字列を生成する。
- インスタンス生成・初期化の際、必要なパラメータは渡してプロパティとして持っており*1、それを使うので、このメソッドでパラメータに渡すものはありません。
*1 プロパティ
@property int oauth_status;
@property (retain) NSString *myConsumerKey; 予めサイトから取得したコンシューマkey
@property (retain) NSString *myConsumerSecret; 同 コンシューマsecret
@property (retain) NSString *myMethod; OAuthのhttpリクエスの送付メソッド(POST,GET)
@property (retain) NSURL *myURL4TemporaryCredential; TemporaryCredentialリクエスト先のURL
@property (retain) NSURL *myURL4VerifierCode;
@property (retain) NSURL *myURL4AccessCredential; TokenCredentialリクエスト先のURL
@property (retain) NSString *temporary_credential; 取得したtemporaryCredential(key)の保持用
@property (retain) NSString *temporary_credential_secret; 同secretの保持用
@property (retain) NSString *access_credential; 取得したtokenCredential(key)の保持用
@property (retain) NSString *access_credential_secret; 同secretの保持用
- (BOOL) getOAuthHeader4AccessCredentialAndStoreToPropertyWithVerifierCode:(NSString *)aVerifierCode;
- OAuthのToken Credential取得用httpリクエストのための、OAuthヘッダの文字列を生成する。
- この前のステップ(概要の4項)で取得済みのverified codeを、パラメータとして渡す。