Windows Live ID に対応したサイトの作成

とりあえず適当にドキュメントを斜め読みしたメモ。まだ実際に試していない。

  • アプリケーションを Windows Live ID サイトに登録する
  • サインインさせるためのリンクを作成する
  • 認証の結果を受け取るページを作成する

の3つの工程を必要とします。

アプリケーションの登録

https://msm.live.com/app/ の Register an Application を使用して、アプリケーション登録を行います。アプリケーションの登録には、

  • アプリケーションの名前(ユニークなもの)
  • 暗号化キー
  • 認証の結果を受け取る URL

の3つが必要になります。Windows Live ID の認証サイトは、「アプリケーションの名前」を指定して認証要求を行うと、「暗号化キー」でデコードできる暗号化されたデータを「認証の結果を受け取る URL」へ送信してくれる。

サインインのためのリンク作成

現在認証済みであるかどうかを判断してサインインまたはサインアウトのリンクを表示することもできるが、Windows Live ID サイトにその判断を行い、正しいリンク先を表示してくれる機能があるので、それを利用するという手段が標準的なようだ。

<iframe
    src="http ://login.live.com/controls/WebAuth.htm
         ?appid=アプリケーションの名前
         &context=任意の文字列
         &style=適用したいCSSスタイル"

    width="80px" height="20px"
    marginwidth="0" marginheight="0"
    frameborder="0" scrolling="no"
    style="border-style: hidden; border-width: 0;"
></iframe>

src に指定する URL は適当にスペースや改行がはいってるが、長い1つの URL になっている。

appid
登録したアプリケーションの名前を指定する。
context
アプリケーション固有の任意の文字列を設定し、状態管理などを行える
style
サインインという文字列の見た目を変更するための CSS を指定できる。利用可能な属性は、font-family, font-weight, font-style, font-size, color, background の6つ。

その他の iframe の属性は見た目を調整するもので、特に必須というわけではない。

認証結果を受け取る

サインインやサインアウトが実施された後、登録しておいた URL へ結果がリクエストされる。サインインでは POST によって3つのパラメータが与えられる。

action
login という文字列
appctx
contextパラメータに指定した内容がそのまま戻ってくる
stoken
暗号化されたユーザ情報

SDK には、.NET (C#)、JavaPerlRubyPythonphp のライブラリがあり、それらを利用するとこのページの作成処理はかなり楽になる。

action パラメータが login であった場合は、ユーザがサインインしたことを示す。SDK のライブラリを利用する場合、ProcessLogin メソッドを呼び出すだけで OK。

switch (this.Request["action"])
{
  case "login":
    WindowsLiveLogin.User u = wll.ProcessLogin(this.Request.Form);

    // 自動でサインインするチェックボックスが on であったか調べる
    if (u.UsePersistentCookie)
    {
       ...
    }

    // セッションに状態を保存するなどなど
    // その他、自サイトで必要な状態管理を開始する

みたいなかんじだ。手動で stoken から認証結果をデコードする方法は SDK ドキュメントや WindowsLiveLogin クラスのソースコードを見るといいだろう。(特に難しいわけではない)
認証結果には、次の情報が含まれている

appid
認証に成功したアプリケーションの名前、正しく自分の登録情報と一致しているかどうか確認しておくとよいかんじ?
uid
認証に成功したユーザのユニークな識別子。ライブラリでは、WindowsLiveLogin.User.Id プロパティから取得可能。
ts
認証の実施された時刻を表す1970/01/01からの経過秒数。ライブラリでは、WindowsLiveLogin.User.Timestamp プロパティから取得可能。
flags
32個のビットフラグ、現在は bit0 のみが有効で on であればユーザがログイン情報の保存を要求している*1という意味になる。ライブラリでは、WindowsLiveLogin.User.UsePersistentCookie プロパティから取得可能。

なお、appctx の内容は WindowsLiveLogin.User.Context プロパティから、stoken そのものは WindowsLiveLogin.User.Token プロパティで取得できる。


サインアウトでは、action が clearcookie と logout という2つ値で GET リクエストが発生する。先に発生するのは clearcookie らしい。どちらかのリクエストを受け取った時点で、自分の開発しているサイト上でのユーザの状態管理をログアウトした状態にする。

clearcookie は画像をレスポンスとして返し、logout はログアウト完了後のユーザが目にする内容を返すように作成する必要がある。ライブラリを利用している場合は clearcookie のレスポンスを作成するのに、GetClearCookieResponse() メソッドが利用できる。

  case "clearcookie":
    ClearCookie();

    string content_type;
    byte[] content_body;
    wll.GetClearCookieResponse(out content_type, out content_body);

    // ライブラリによって生成された内容を返す
    this.Response.ContentType = content_type;
    this.Response.OutputStream.Write(content_body, 0, content_body.Length);
    this.Response.End();
    break;

  case "logout":
    ClearCookie();

    // 面倒なのでトップページにリダイレクトしちゃう
    this.Response.Redirect("~/default.aspx");
    break;

// 共通処理
private void ClearCookie()
{
  // セッションを利用しているなら、ここでセッションを破棄すればよい
  this.Session.Abandon();

  // クッキーを使っていたら、expire させるようなクッキーを生成&追加
  this.Resposen.Cookies.Add(...);
}

*1:サインインの画面で save my password のチェックボックスを on にした