はじめに
今回は前回に引き続き,通常のWebサイトからLive FrameworkとWindows Live ID Delegated Authentication(委任認証)を利用してMeshサービスへアクセスする方法についてです。Webサイトは,ユーザーにユーザーデータへのアクセス許可を承諾してもらうことで始めてMesh上のデータへアクセスが可能になります。前回は,許可の承諾を行う承認要求ページ(図1)への遷移まで紹介しました。今回は承認情報を受信し,Meshサービスへアクセスします。
開発環境
承認情報を受信するにあたり,前回も触れたとおりLiveサービスからWebサイトへアクセスできる必要があります。つまり,Visual Studioで使用するASP.NET開発サーバーではWebサイトのデバッグができません。今回の内容を確認するためには,リモートのWebサーバーへWebサイトを配置したり,IISを開発用PCへインストールし外部からアクセスできるようネットワークの設定をしたりする必要があります。以下に準備すべき開発環境について簡単に説明します。
セキュリティに気を付ける必要がありますが,個人の開発では開発PCをWebサーバーとして公開する方法がPCも1台で済み手軽な方法でしょう。Windows Vistaの場合,コントロールパネル内のプログラムから「Windows機能の有効化と無効化」よりWebサーバー機能を持つIISをインストールできます。
次にWebサイトのドメインについてです。Liveサービスは「gihyo.jp」などのような,ドメインを使用してWebサイトにアクセスするため固定のIPアドレスを所有している必要はありません。ダイナミックDNSサービスなどを利用してアクセスできるようにしましょう。開発PCをWebサーバーとした場合,ドメインを使用して自身のWebサイトにアクセスすることは通常できません。そのため,hostsというシステムファイルを書き換え,自PCから対象ドメインへアクセスした場合はlocalhost(127.0.0.1)にアクセスするよう設定します。hostsファイルは「%SystemRoot%\System32\drivers\etc」にあります。管理者権限でメモ帳などのエディタから開き,以下の行を追加します。ドメインはAzure Services Developer Portalで登録したWebサイトのドメインです。
127.0.0.1 example.jp
これ以外にもルーターの設定などを行い,Liveサービスを含む外部からドメインにより開発PC上のWebサーバーへアクセスできるようにし,開発PC・外部どちらからもドメインによりWebサーバーへアクセスできるようにします。
承認情報の受信
承認要求ページ上でのユーザー操作により,指定したページアドレスにLiveサービスから承認結果がHTTP POSTメソッドを用いて送られてきます。受信するページは,Azure Services Developer PortalでWebサイトを登録したときにReturn URLの値として指定したアドレスです。また,承認要求のURLのruパラメーターの値としても指定していました。
本連載では,「delauth-handler.aspx」という名前のページにしていました。このページをプロジェクトに追加します。プロジェクトに「新しい項目の追加」からWebフォームを選択します(図2)。
このページで承認情報を受信し,その内容により適切なページへリダイレクト(今回はDefault.aspxとします)するよう処理します。
承認情報
Windows Live ID委任認証の仕組みとしては,ユーザーがアクセス許可をした場合/キャンセルした場合とも,許可またはキャンセルしたという結果がLiveサービスより送られてきますが,Live Framework CTPではユーザーがキャンセルした場合,情報は何も送信されないようです。ユーザーがアクセス許可を承諾した場合にLiveサービスから送信されるPOSTデータのパラメータは次の4個です。
- ResponseCode
ユーザーが,アクセス許可の承諾またはキャンセルを示す値です。承諾したときの値は「RequestApproved」です。
- ConsentToken
承認トークンと呼ばれる文字列です。このトークン内は,さらに複数のパラメータに分割でき,ユーザーデータのアクセスに必要な情報が含まれています。
- action
ユーザーが行った操作を示す値です。承認要求の完了を示す「delauth」という値になります。
- appctx
Webサイトが必要に応じて利用するための値です。承認要求時のURLに「appctx=…」というようにパラメータを指定しておくと,その値が返ってきます。本連載では使用していません。
承認トークン
承認トークンは暗号化されています。復号化すると,次の値が含まれています。
- 委任トークン
- 更新トークン
- セッションキー
- オファーとアクション
- 委任トークンの有効期限
- Location ID
それぞれの内容はわからないと思いますが,どれも委任認証に出てくる単語ですので当然です。ただし,オファーとアクションは前回出てきましたね。この中で最低限必要なものは委任トークンと呼ばれる文字列です。
委任トークンは,Meshサービスへ接続する際に認証に使用します。本連載ではこれまでにMeshサービスへ接続する(Live Operating Environmentへ接続する)際にWindows Live IDアカウント情報を使用していましたが,委任トークンを使用した接続も可能です。
本記事では,承認トークンの復号化と各パラメータの取得はWindows Live ID Delegated Authentication SDKに含まれるクラスライブラリに任せます。承認トークンの復号化や各パラメータの詳しい内容を知りたい方は「使ってみよう! Windows Live SDK/API」の第15回にて扱っていますので,そちらを参照してください。
委任トークンの取得
それでは,Liveサービスから送信された情報から,委任トークンを取得するコードを書いていきましょう。委任トークンを取得後は,Cookieに格納しDefault.aspxへリダイレクトします。Default.aspxではCookie情報を確認し,委任トークンがある場合はMeshサービスへのアクセス処理へ,ない場合は前回の内容の承認要求ページへのリンクを表示するようにします。
delauth-handler.aspx.vbに以下のように処理を記述します。
Imports WindowsLive
Partial Class delauth_handler
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Request("action") = "delauth" Then
' アクセス許可の承諾処理が完了している場合
' 承認トークンの取得
Dim login = New WindowsLiveLogin(True)
Dim consentToken = login.ProcessConsent(Request.Form)
' 委任トークンを Cookie へ格納
Dim cookie = New HttpCookie("consentToken")
cookie("delToken") = consentToken.DelegationToken
cookie.Expires = consentToken.Expiry.ToLocalTime
End If
' Default.aspx へリダイレクト
Response.Redirect("Default.aspx")
End Sub
End Class
ページが読み込まれた時,POSTデータのactionパラメータの値がdelauthのとき承認要求ページから遷移し,アクセス許可が承諾されたと判断しています。委任トークンは前述の通りLive ID Delegated Authentication SDKのクラスを利用して取得しています。委任トークンには有効期限があります。コードではこれを利用してCookieの有効期限の設定も行っています。

