使ってみよう! Live Framework

第11回Live Framework-enabled Webサイト(2/2)

はじめに

今回は前回に引き続き、通常のWebサイトからLive FrameworkとWindows Live ID Delegated Authentication(委任認証)を利用してMeshサービスへアクセスする方法についてです。Webサイトは、ユーザーにユーザーデータへのアクセス許可を承諾してもらうことで始めてMesh上のデータへアクセスが可能になります。前回は、許可の承諾を行う承認要求ページ図1への遷移まで紹介しました。今回は承認情報を受信し、Meshサービスへアクセスします。

図1 承認要求ページ 図1 承認要求ページ

開発環境

承認情報を受信するにあたり、前回も触れたとおり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)。

図2 Webフォームの追加
図2 Webフォームの追加

このページで承認情報を受信し、その内容により適切なページへリダイレクト(今回は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の有効期限の設定も行っています。

Meshサービスへの接続

前回作成したDefault.aspxを編集し、delauth-handler.aspxからDefault.aspxへリダイレクトされたときの処理を追加します。Cookieに委任トークン情報が格納されている場合は、Live Operating Environmentへ委任トークンを使用して接続します。今回はWebサイトからMeshサービスに接続することが目的ですので、処理内容は単純にユーザー名の表示とアクセス許可のあるMesh Object名を列挙することにします。

まずWebページのデザイン部分を変更します。承認要求ページのリンク部分に加え、Mesh情報を表示する領域を追加します。

<div>
    <span id="linkConsent" runat="server"><a href="<%=ConsentUrl%>">アクセス許可の設定</a></span>
    <span id="mesh" runat="server"></span>   
</div>

続いてページが読み込まれた時の処理も変更します。ページのLoadイベント時の処理は次のようになります。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ' オファーとアクション
    Const offers As String = "LiveMeshFolder.Full,Profiles.Read,Contacts.Write,News.Full"

    ' WindowsLiveLogin インスタンス生成 True 指定で Web.config の値を使用
    Dim login = New WindowsLiveLogin(True)

    ' 承認要求 URL の作成
    Me.ConsentUrl = login.GetConsentUrl(offers).Replace("Delegation.aspx", ) & _
        "&appUrl=" & HttpUtility.UrlEncode(WebConfigurationManager.AppSettings("wll_appurl"))

    ' 前回のコードから追記部分↓

    If Request.Cookies("consentToken") Is Nothing Then
        ' 承認トークンの Cookie がない場合、承認要求リンク表示
        linkConsent.Visible = True
        mesh.Visible = False
    Else
        linkConsent.Visible = False
        mesh.Visible = True

        ' Live Operating Environment
        ConnectToLoe(Request.Cookies("consentToken")("delToken"))
    End If
End Sub

Cookieの内容により処理を分岐しています。Cookieから委任トークンを取得し、ConnectToLoeメソッドの引数として渡しています。このメソッドでMeshサービスへアクセスし、情報をページに表示します。

ConnectToLoeメソッドは以下のように記述します。

Protected Sub ConnectToLoe(ByVal token As String)
    ' LOE へ接続
    Dim loe = New LiveOperatingEnvironment()
    loe.Connect(token, _
                AuthenticationTokenType.DelegatedAuthToken, _
                New Uri("https://user-ctp.windows.net/V0.1"), _
                New LiveItemAccessOptions(True))

    ' Mesh 情報の表示
    Dim userName = loe.Mesh.ProvisionedUser.Name ' ユーザー名
    Dim objects = From mo In loe.Mesh.MeshObjects.Entries Select mo.Resource.Title ' Mesh Object
    Dim mos = String.Join(", ", objects.ToArray)
    mesh.InnerText = String.Format("ユーザー名: {0}, アクセス可能な Mesh Object: {1}", userName, mos)
End Sub

LiveOperatingEnvironmentクラスのConnectメソッドの第1引数に委任トークン文字列を渡し、第2引数で委任認証を利用した接続であることを指定しています。

Live Operating Environmentへ接続すると後はこれまでの本連載で扱った内容と同様にMeshサービスへのアクセスが可能です。上記のコードでは、データ所有者のユーザー情報とMesh Objectの一覧を取得しています。

ここまでを実行してみましょう。Default.aspxを開くと承認要求ページへのリンクが表示されます図3⁠。

図3 承認要求ページへのリンク
図3 承認要求ページへのリンク

リンクをクリックして承認要求ページへ移動します。規定ではどのMesh ObjectにもWebサイトからアクセスできないようになっているので、⁠Change」リンクをクリックしアクセス許可を与えるMesh Object(Live Meshフォルダ)を選択します図4

図4 アクセス許可を与えるMesh Objectの選択
図4 アクセス許可を与えるMesh Objectの選択

そして、⁠Allow access」ボタンをクリックします。すると正しく動作していれば、delauth-handler.aspxがロードされDefault.aspxへリダイレクトされるはずです。ページにはユーザーデータの情報が表示されたでしょうか図5⁠。

図5 ユーザーデータ情報の表示
図5 ユーザーデータ情報の表示

もし正しく表示されていない場合は、Visual Studioを使用してブレークポイントを設定するなどしてdelauth-handler.aspxが正しく読み込まれているか、処理分岐が正しく行われているかなどを確認してみましょう。

承認情報の管理

今回作成したWebサイトでは委任トークンをCookieに保存しているだけですので、通常はユーザーデータの所有者しかWebサイトを通じてデータにアクセスできません。しかし、このトークンをWebサーバー上に保存しておくことで第3者にもユーザーデータの提供が可能です。これについては、このような仕組みのための認証ですので問題ありませんが、ユーザーデータの所有者が承諾を取り消したい場合はどうすればいいのでしょうか。

委任認証では、ユーザーはいつでもWebサイトに対してデータの公開範囲やアクセス許可の変更が可能なページが用意されています。https://consent.live.com/ManageConsent.aspxへアクセスすることで各Webサイトへのアクセス許可の一元管理が可能になっています。ただし、Live Framework CTPの内容について正しく動作しているところは確認できていません。このような仕組みがあることだけ現時点では気に留めておくとよいかと思います。

Live Framework CTPでは指定はできませんが、ユーザーデータのアクセスは期限付きで許可することが委任認証の仕組みでは可能です。ユーザーデータのアクセス期限のほか、委任トークン自身にも有効期限があり、これを過ぎてしまったトークンは使用することができません。通常、ユーザーデータの期限よりも短く設定されています。

期限切れになった場合、再びユーザーの許可の承諾によりアクセスが可能になります。ただし、期限切れがトークンだけの場合、ユーザーの手を介さずに有効期限を更新することが可能です。それには承認トークンに含まれている更新トークンというものを使います。Webサイトは、Liveサービスとやりとりすることで新たな委任トークンが取得できます。Live Framework CTPでは仕組みは用意されているものの動作は確認できませんでした。この仕組みも委任認証によるもので詳しくは使ってみよう! Windows Live SDK/API第15回にて扱っています。


Live Framework-enabled Webサイトについては今回で以上です。いかがでしたでしょうか。Live Framework SDKには.NET Framework用のライブラリがあるためASP.NETを使用すると簡単にMeshサービスへアクセスすることができますが、Live Operating Environmentとの対話をHTTPとXMLを用い自力でコーディングしさえすれば、PHPやRubyといった言語でもアクセスが可能です。情報は少なく英語でしかありませんが、興味のある方はぜひトライしてみてください。

おすすめ記事

記事・ニュース一覧