Pinto公開に向けて #2 ― ユーザ登録周りのURIを考えた
あらすじ
Pintoというソーシャルブックマークサービスを作ろうとしています。ソーシャルというぐらいなので、ユーザ登録処理の実装が必要です。『RESTful Webサービス』で提唱されているROAの流儀に従い、ユーザ登録処理に必要なリソースとそのURIを決めていきます。
トップページ
その前に、PintoのトップページのURIを決めるべきですね。pito.jpというドメインを取得済みなので、素直に http://pinto.jp/ にします。
ただし、夢は大きく世界中の方に使っていただきたいので、トップページを含むすべてのリソースを多言語で提供します。とりあえず、日本語版と英語版を提供しましょう。URIはそれぞれ http://pinto.jp/index.ja 、 http://pinto.jp/index.en にします。
「続・多言語リソースのURIに関する覚書」に書いたとおり、単に http://pinto.jp/ にアクセスされた場合は「300 Mulitiple Choices」を返し、 index.ja と index.en へのリンクをHTMLに含めます。ユーザはブラウザのAccept-Language設定をいじることなく好きな言語が選べるわけです。
以下、すべてのURIはプラトニック形式(言語未指定)で記述します。トップページ同様、プラトニック形式のURIにアクセスがあった場合は「300 Mulitiple Choices」とし、日本語版/英語版へのリンクをHTMLに含めます。
OP選択画面
認証にはOpenIDを使います。OpenID 2.0で採用されたOP Identifierという仕組が便利なので、これを採用します。「yahoo.co.jp」と入力するだけでYahoo! JAPANの認証ページに飛ぶというアレです。
「個人的なホワイトリスト案」に書いたように、対応するOPはホワイトリスト方式で絞り込みます。現状、「myopenid.com」「yahoo.com」「yahoo.co.jp」への対応を考えています(XRIは普及するまで無視)。
ユーザ登録時には、上記OPのどれを認証に使うか、まずユーザに選ばせます。セレクトボックスか各OPのロゴ画像で選ばせようと今のところは考えています。
OP選択画面を作らず、トップページにこのセレクトボックス(またはロゴ画像)を置く手もありますが、ユーザ登録は一度きりなので、別画面に切り出したほうが良さそうです。
というわけで、OP選択画面リソースが必要になります。URIは下記に決めました。
- http://pinto.jp/signup_forms/openid
サインアップ用のフォームがいくつかあるなかで、OpenIDを入力するタイプ、というイメージです。
OPへのリダイレクタ
「JavaScriptによるHTMLフォームリダイレクトがなんかやだ」に書いたとおり、OPへのリダイレクトはHTTPリダイレクトで行おうと考えています。
そこで、リダイレクタリソースが必要になります。URIは下記に決めました。
- http://pinto.jp/signup_forms/auth?openid=myopenid.com
- http://pinto.jp/signup_forms/auth?openid=yahoo.com
- http://pinto.jp/signup_forms/auth?openid=yahoo.co.jp
URI Templates式に書くと:
- http://pinto.jp/signup_forms/auth?openid={OP Identifier}
サインアップ用のフォームがいくつかあるなかで、OP上の認証フォーム、というイメージです。これらのURIにアクセスすると、指定OPの認証画面にリダイレクトされます。
コールバック先
続いて、OPからのコールバック先を決めなければなりません。コールバック先では、ユーザは好きなアカウント名を入力し、登録ボタンを押します。URIは下記に決めました。
- http://pinto.jp/signup_forms/account
サインアップ用のフォームがいくつかあるなかで、アカウント名を入力するタイプ、というイメージです。実際にはクエリストリングが山ほど付きます。
ユーザの親リソース
ユーザリソースはPOSTで作成されるわけですが、POSTで作成されるリソースは、常に何らかの従属リソースであるはずです。つまり、親リソースがあるということです。
親リソースの候補としては、トップページ(Pinto自体)かユーザ一覧になるでしょう。ユーザ一覧へのアペンドと考えるのが自然だと思うので、URIは下記に決めました。
- http://pinto.jp/users
ユーザリソース
あとはユーザリソースのURIを決めれば終わりです。悩むとすればデータベース上のIDをURIに含めるか含めないかだけでしょう。少なくともユーザリソースについては、データベース上のIDより、アカウント名それ自身をURIに含めたほうが、ユーザ的には嬉しいのではないかと思います。そこで、URIは下記に決めました。
- http://pinto.jp/users/{アカウント名}
次のアクション
- http://addressable.rubyforge.org/を使ってルーティング処理を実装する(急ぎすぎ?)