ページ

2010年3月19日金曜日

Keychain Services 調査 (17) コーディング #5 認証フロー実装(認証ウィンドウの Nib化)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

Cocoaの日々: Keychain Services 調査 (16) コーディング #5 認証フロー実装(最初のバージョン)

Keychainの本題とは段々づれていくのだが、前回作成した認証シートを Nib化してみる。

専用のコントローラを用意し、認証シートを使う側はそのコントローラを操作する。
イメージはこんな感じ。



新たに AuthenticationWindowController を用意し、このクラスで認証シートと Keychain Serviceの操作を行う。利用するアプリはこのインスタンスのメソッドを呼び出すだけでいい。認証シート(NSWindow)は Nib化してあり、AuthentionWindowController が必要な時に動的に読み込んで表示する。認証および、認証後の処理は ApplicationWindowDelegate のメソッドをコールバックする。

AuthenticationWindowController.h

#import

@class AuthenticationWindowDelegate;
@interface AuthenticationWindowController : NSObject {

IBOutlet NSWindow* window_;

NSWindow* attachedWindow_;
NSString* username_;
NSString* password_;

AuthenticationWindowDelegate* delegate_;
}

@property (assign) NSWindow* attachedWindow;
@property (copy) NSString* username;
@property (copy) NSString* password;
@property (assign) AuthenticationWindowDelegate* delegate;

- (void)displayAuthenticationWindowWithUsername:(NSString*)username password:(NSString*)password;

-(IBAction)login:(id)sender;
-(IBAction)cancel:(id)cancel;
@end


認証シートをアタッチしたいウィンドウやデリゲートはプロパティで設定する。メンバ変数の表現(後ろに _ を付ける)は Google のコーディング規約を真似てみた。実装のほとんどは前回の処理をそのままこのクラスへ持ってきて修正しただけ。なお NSTextField と username_ との紐付けには Bindings を使っている(password_も同様)。


認証実行と認証結果のコールバックには専用のプロトコルを用意してみた。
AuthenticationWindowDelegate.h
@protocol AuthenticationWindowDelegate

- (BOOL)authenticateWithUsername:(NSString*)username password:(NSString*)password;
-(void)didAuthenticateWithUsername:(NSString*)username result:(BOOL)result;
@end

コンテキスト情報なども渡せるようにするといいかもしれない。


ソースは GitHub からどうぞ
KeychainSample1 at 2010-03-19 from xcatsan's SampleCode - GitHub

- - - - -
Nib に切り出せると簡易的なライブラリ化ができるので便利。今回認証シートと関連処理を切り出せたので、別のアプリへはこの Nib と必要なクラスを持っていけば簡単に利用できる。それにしても Nib の File's Owner の考え方は大白い。このちょっとしたプレースホルダーがあるだけで MVC を意識した構成がずいぶん取りやすくなる。

なおウィンドウコントローラは NSWindowController を使わずに自前で用意した。NSWindowController は Documentアーキテクチャに合わせて作ってあるのでなんとなく避けた。