はじめに
今回から数回に渡って、
Windows Live ID DelegatedAuthentication
Windows Live ID Delegated Authentication
委任認証を利用するとWindows Live IDによる認証が必要なデータにアクセスできます。そのためにはWebアプリケーション側は、
委任認証を利用したWebアプリケーションの利点として、
Windows LiveサービスのユーザーデータとそのAPIは、
Windows Live Contacts API:
Windows Live HotmailやMessengerに使用するコンタクト情報にアクセスWindows Live Photo API:
Windows Liveスペース上の写真にアクセスWindows Live Application Based Storage API:
Webアプリケーション用のデータストレージ
承認の流れ
ユーザーデータへアクセスするため、

ユーザーが委任認証を利用したWebサイトへアクセスします。Webアプリケーションを提供しているWebサイトのことをアプリケーションプロバイダと呼びます。
WebサイトはWindows Liveの承認要求ページへリダイレクトします。Webサイトは、
ユーザーデータにアクセスするためにユーザーに承認を要求します。具体的には承認要求ページへのURLを示し、 ユーザーがクリックすることで移動します。移動先のユーザーデータに対する承認・ 拒否するページを承認要求ページ (図2) と呼びます。また、 この承認情報を管理するサービスをWindows Live ID承認サービスと呼びます。

ユーザーは表示された承認要求ページにて、
アプリケーションプロバイダから要求されたユーザーデータへのアクセス許可に対して承認または拒否を行います。 対象となるユーザーデータのカテゴリをオファー、
そのオファーに対して操作可能な機能 (読み取りや書き込みなど) をアクションと呼びます。この組み合わせを 「許可」 と呼びます。 承認要求ページからWebサイトへ承認情報とともにリダイレクトされます。ユーザーが承認または拒否を行うと
(ボタンをクリックすると)、 Webサイトが戻り先URLとして指定していたページへ移動します。このときPOSTデータに承認結果の情報が含まれています。ユーザーが承諾した場合 「承認トークン」 と呼ばれるユーザーデータのアクセスに必要な文字列が返ります。 承認トークンの内容を使用して、
WebサイトはユーザーデータAPIを利用してユーザーデータにアクセスできます。このユーザーデータを提供しているWindows Liveサービスをリソースプロバイダと呼びます。
ここまでがユーザーデータにアクセスするまでの一連の流れになります。一度、
アプリケーションIDの取得
委任認証を利用するためにWebアプリケーションを登録しアプリケーションIDを取得します。登録時にWebサイトのURLドメインを指定する必要があるため、
アプリケーションIDを取得するには、

次の項目を入力します
- Application Name
アプリケーション名。適当なものを入力します。登録後に変更はできません。
- Return URL
戻り先URL。承認要求ページからリダイレクトされるWebサイトのアドレスです。
- Domain Name
ドメイン名。アプリケーションの完全修飾のドメイン名を指定します
(例: www. gihyo. jp)。戻り先URLに使用しているドメインと同じである必要があります。ひとつのドメインに対してひとつのアプリケーションIDしか登録できません。 - Secret Key
シークレットキー。アプリケーションプロバイダとWindows Liveサービスとの間で共有する暗号用の文字列を指定します。
- Application verifier required
アプリケーション検証が必須かどうか。後ほど説明に出てきますが、
アプリケーションが承認を要求するとき、 承認要求ページへのURLにアプリケーション検証トークンを必ず含めるかどうかを示す数値です。1を選択すると必須になります。
画像の文字列を入力し、
[Submit]
承認の要求
まずは、
承認要求のURLは
- ru
承認要求ページからの戻り先URLを指定します。アプリケーションIDを取得している場合、
この値を登録しているため省略できます。登録したURLとは異なるものをドメインが変わらない範囲で指定することもできます。 - ps
アプリケーションプロバイダが必要とする許可
(オファーとアクション) を表す文字列を指定します。今回は扱いませんが例えば次のようなものになります。 SpacesPhotos.
ReadWrite,ContactsSync. FullSync,ApplicationStorage. ReadWrite SpacesPhotosがオファー、
ReadWriteがアクションになります。オファーとアクションはピリオド (.) でつなぎます。複数の許可を指定する場合は各許可をコンマ (,) で区切ります。 - pl
プライバシーポリシーのURLを指定します。アプリケーションプロバイダのプライバシーポリシーを表示するためのものです。承認要求ページから参照されます。必須のパラメータです。
- app
アプリケーション検証トークンと呼ばれる文字列を指定します。これはアプリケーションIDを取得している場合のみ有効です。アプリケーション登録時にアプリケーション検証を必須にしていた場合、
必ず指定する必要があります。アプリケーション検証トークンは、 承認サービスがアプリケーションプロバイダを識別するために使用されます。作成方法はこの後説明します。 - mkt
Webサイトのカルチャ名を指定します。たとえば日本
(言語が日本語で地域が日本) の場合は 「ja-JP」 となります。この値は省略可能です。 - appctx
Webアプリケーションが必要に応じて指定するためのものです。承認のプロセスにおいてユーザーは一度Webサイトから承認要求ページに移動します。移動前にこのパラメータを使用し値を指定しておくことで、
承認要求ページから戻ってきた際にその値が取得でき、 何らかの処理の継続を可能にします。
以上が承認要求のパラメータです。
例えばパラメータを次のようにした場合、
- ru:http://
sample. gihyo. jp/ Sample/ Default. aspx - pl:http://
sample. gihyo. jp/ Sample/ PrivacyPolicy. aspx - ps:ApplicationStorage.
ReadWrite - mkt:ja-JP
承認要求ページへのリンクのHTMLは以下のようになります。
<a href="https://consent.live.com/Delegation.aspx?ru=http%3a%2f%2fsample.gihyo.jp%2fSample%2fDefault.aspx&ps=ApplicationStorage.ReadWrite&pl=http%3a%2f%2fsample.gihyo.jp%2fSample%2fPrivacyPolicy.aspx&mkt=ja-JP">Requesting Consent</a>
パラメータに指定した値はURLエンコードしてあります。また、
アプリケーション検証トークンの作成
承認要求のURLのパラメータに必要なアプリケーション検証トークンを作成します。アプリケーション検証トークンのパラメータ
- appid
16文字の取得したアプリケーションID。
- ts
1970年1月1日
(UTC) から経過した秒数 - sig
シークレットキーを使用したHMAC-SHA256ハッシュ関数によるappidとtsのハッシュ値をBase64でエンコードした文字列。
以上の値を
具体的なコードをVB.
Public Shared Function GetTimestamp() As String
Dim refTime As DateTime = New DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
Return CUInt((DateTime.UtcNow - refTime).TotalSeconds).ToString
End Function
次に委任認証で使用されるシークレットキーからハッシュ値を得るメソッドを示します。シークレットキーに接頭辞を付け、
' Imports System.Security.Cryptography
Public Shared Function Derive(ByVal secretKey As String, ByVal prefix As String) As Byte()
Dim hashAlgorithm As New SHA256Managed
Dim buffer() As Byte = System.Text.Encoding.Default.GetBytes(prefix & secretKey)
Dim hashOutput() As Byte = hashAlgorithm.ComputeHash(buffer)
Dim byteKey(15) As Byte
Array.Copy(hashOutput, byteKey, byteKey.Length)
Return byteKey
End Function
アプリケーション検証トークンを作成する場合、
Public Shared Function GetSignatureToken(ByVal secretKey As String, ByVal token As String) As Byte()
Dim key() As Byte = Derive(secretKey, "SIGNATURE")
Dim hashAlgorithm As New HMACSHA256(key)
Dim data() As Byte = System.Text.Encoding.Default.GetBytes(token)
Return hashAlgorithm.ComputeHash(data)
End Function
GetSignatureTokenメソッドに与える文字列は
Public Shared Function GetAppVerifierToken(ByVal applicationId As String, ByVal secretKey As String) As String
Dim timeStamp As String = GetTimestamp()
Dim token As String = String.Format("appid={0}&ts={1}", applicationId, timeStamp)
Dim signature As String = HttpUtility.UrlEncode(Convert.ToBase64String(GetSignatureToken(secretKey, token)))
Return HttpUtility.UrlEncode(String.Format("appid={0}&ts={1}&sig={2}", applicationId, timeStamp, signature))
End Function
アプリケーションIDとシークレットキーを渡すとアプリケーション検証トークンを返します。
先ほどの承認要求ページへリンク例のURLに作成したメソッドを使ってアプリケーション検証トークンを付けると次のように書くことができます。
<%
Dim ru As String = HttpUtility.UrlEncode("http://sample.gihyo.jp/Sample/Default.aspx")
Dim pl As String = HttpUtility.UrlEncode("http://sample.gihyo.jp/Sample/PrivacyPolicy.aspx")
Dim ps As String = "ApplicationStorage.ReadWrite"
Dim mkt As String = "ja-JP"
Dim params As String = String.Format("ru={0}&ps={1}&pl={2}&mkt={3}&app={4}", ru, ps, pl, mkt, GetAppVerifierToken("****Application ID****", "****SecretKey****"))
%>
<a href="https://consent.live.com/Delegation.aspx?<%=params%>">Requesting Consent</a>
今回はここまでです。以上の内容だけではまだ何もできませんが、