« UCDViewer 1.1.0リリース | トップページ | DelphiでWindows Live(SkyDrive)・・・(2) »

2012年1月15日 (日)

DelphiでWindows Live(SkyDrive)

以前 にDelphi用のヘッダを公開した同期フレームワークMicrosoft Sync Frameworkを試すために、最初はDropboxと組み合わせて色々遊んでいたが、Dropbox APIの挙動で一部不満wobblyな部分があったので急遽、SkyDriveに変更したのだが、せっかくライブラリっぽく仕上げたので、公開してみる。

と、いっても最近のDelphiはクロスプラットフォーム開発環境にまっしぐらであるが、作ったライブラリは内部でWinInetを使って環境依存しまくりなのでdash。また、.NETはAsyncResult、TaskだのJavaはFutureだの非同期操作がまっさかりであるが、非同期操作はサポートしてないので(いい加減にしろよ、ウンコDelphi)・・・。特にSkyDriveのようにファイルのアップロード・ダウンロードなど巨大なデータをやり取りする場合、非同期操作のキャンセルができんとちょっと・・

まぁ、スレッドセーフには作ってあるので、自前でスレッド作って、同時にアクセスするのは問題ないんだが、肝心のキャンセルはできませんsad

ということで、ダウンロードは


から。

使用する場合は、LiveDemoフォルダ以外のユニットを全部プロジェクトに追加して下さい。
開発環境はDelphi2010です。XE,XE2ならまだしも2009は無理かも。ライブラリの動作環境は、Internet Explorer7以降が必要です。内部でのUrlの操作にIUriというものを使っているので。LiveDemoフォルダにLiveDemoアプリがありますが、こちらはVista以降が必要です。

事前準備として、Liveの基本的な知識はLive SDKのREST APIのドキュメントWindows Live Developer Center で学んでおいてください。Windows Liveのアカウントももちろん必要です(開発用のアカウントを作成する事をお勧めします)。後、アプリを自分で登録して、クライアントIDを発行してもらう必要がありますので。Registering Your Application with Windows Live を参考に登録してください。

まずは、主なユニットから

  • Live.pas
  • Live.Client.pas
  • Live.Protocol.Request.pas
  • Live.Protocol.Response.pas

Live.pasでLiveに関する基本的なインターフェースなどを定義しています。Live.Protocol.Request.pasとLive.Protocol.Response.pasで、LiveのREST APIの低レベルなラッパーを実装して、これらを使いLive.Client.pasで、LiveClientオブジェクトを実装しています。

通常は使用するユニットのuses節にLive.pasとLive.Client.pasの2つだけを追加すればいいはずです。この2つの中身を見れば分かると思いますが、すべてinterfaceベースですので、オブジェクトの破棄とか気にする必要はありません。

ということで簡単な使い方。

まず、TLive.CreateClientContextメソッドでクライアントアプリに関する情報を表すClientContextオブジェクト(IClientContextインターフェース)を作成します。

AClientID,AClientSecrentには発行されたクライアントIDとクライアントシークレットを指定します。クライアントシークレットはアプリ登録時に発行されますが、モバイルアプリとしてマークすればここでは、指定しなくてもよさそうです。RedirectUriにはアプリ登録時に指定したUriを指定します。登録時に指定していない場合というかデスクトップアプリの場合は指定しなくてよさげなのですが、その時はデスクトップアプリ用の特殊なリダイレクトUriであるhttps://oauth.live.com/desktopを指定して下さい。必要であれば、ALocaleにはTLocaleクラスで定義されてるロケールを。

次に、これを元にTLiveClientFactory.CreateClientメソッドでLiveClientオブジェクト(ILiveClientインターフェース)を作成します。

ここで、OAuth 2.0 を使って、ユーザーからユーザーの保護されたリソースにアクセスするための許可を取る必要があります。Windows LiveではOAuth 2.0で定義されたImplict grant、Authorization code grantと独自のgrantの計3つ?サポートされていますが、LiveClientオブジェクトはAuthorization code grantだけをサポートします。

まず、LiveClientオブジェクトのCreateAuthorizationUriメソッドでユーザーから認可を得るためのUriを求めます。

AScopesでスコープを指定します。OAuth 2.0ではスコープというもので、アクセスできる情報のレベルを制御できるようになっています。Windows Liveの場合、定義されているスコープの種類と意味はLive SDKのドキュメントのScopes and permissionsを参考に。

また、型がIEnumerable<string>になっていますが、これはヘルパメソッドを用意してあるので、自前で実装する必要はありません。

通常は、LiveDemoアプリのようにTWebBrowserコントロールをホストしたりして自動化するのですが、ここでは、手動でやりますので、求めたUriを自分でブラウザを起動して、開きます。

Windows Liveにログインしていなければ、まず、ログインページが表示されます。

Live1_0

ログインすると、アプリがユーザーの保護されたリソースにアクセスしてよいかを許可・拒否するページに移動します。

Live1_1

表示される中身は先ほど指定したスコープやロケールで変わります。上の画面ではロケールにTLocale.Japaneseを指定したので日本語で表示されています。ここでは、「はい」を選択して許可します。すると、先ほど指定したRedirectUriにブラウザがリダイレクトします。

RedirectUriにAuthorization codeが含まれてるので、それを抜き出し、LiveClientオブジェクトのLoginメソッドに渡してログインします。

成功すると認証に関する情報を表すAuthContextオブジェクト(IAuthContextインターフェース)が返されますが、ほっといていいでしょう(LiveClientオブジェクトのAuthContextプロパティにセットされるので)。以上をまとめると次のよう感じになります。

これで、やっと、SkyDriveにアクセスできるようになるのですが、長くなったので、次回に続く・・ということなんですが、OAuth 2.0に関してちょっと補足しておきます。

OAuth 2.0ではユーザーからの許可を取ると、クライアントアプリにAccess Token(AuthContextオブジェクトのAccessTokenプロパティ)というものが発行され、以後、クライアントアプリはこのAcesss Tokenを使ってユーザーの保護されたリソースにアクセスするのですが、発行されてからある期間(AuthContextオブジェクトのExpiresInプロパティ)すぎると失効したりします。

Windows Liveの場合、現状、3600秒つまり1時間でAccess Tokenが失効するっぽいので、失効したら再取得する必要があります。新しいAccess Tokenを取得するために上記のフローを繰り返すのではあんまりなので、OAuth 2.0にはRefresh Token(AuthContextオブジェクトのRefreshTokenプロパティ)という仕組みが用意され、これを使い簡単に新しいAccess Tokenを取得できます。Windows Liveの場合、要求するスコープにwl.offline_accessを含めるとRefresh TokenがAccess Tokenと共に発行されるようですので、必要ならばこのスコープを最初に指定しておいて下さい。

LiveClientオブジェクトでRefresh Tokenを使って、Access Tokenを再取得する場合は、LiveClientオブジェクトのRefreshAuthContextメソッドを呼んでください。

Refresh Tokenを使って、Access Tokenを取得するとき、以前に指定したスコープと同じかそれより狭い範囲のスコープの新しいAccess Tokenを取得できますが、通常はANewScopesパラメータにnilを指定すれば、以前と同じスコープのAcesss Tokenになるので、nilでいいでしょう。ちなみに、Windows Liveの場合、このRefresh Tokenの有効期間は1年くらいってどっかみたような・・

まぁ、自前でやるのはだるいので、LiveClientオブジェクトにはAutoLoginプロパティがあります。このプロパティがTrueの時、Refresh Tokenが発行されていて、現在のAccess Tokenが失効していそうなら(ファジーです)、自動で、再取得します。デフォルトはTrueです。PCの日付をある程度合わせておいてねup

« UCDViewer 1.1.0リリース | トップページ | DelphiでWindows Live(SkyDrive)・・・(2) »

Delphi」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1497665/43625966

この記事へのトラックバック一覧です: DelphiでWindows Live(SkyDrive):

« UCDViewer 1.1.0リリース | トップページ | DelphiでWindows Live(SkyDrive)・・・(2) »

自作ソフトウェア

無料ブログはココログ

メモ