いますぐ使えるOpenID

第1回OpenIDサービスを利用して、OpenIDの仕組みを理解する

はじめに

Yahoo!やYahoo!JapanがOpenIDサービスの提供を始めたり、MixiがOpenID対応を表明したりと、最近OpenIDについてのニュースを耳にするようになりました。 ところが、OpenIDという言葉は知っていても、実際に使ったことのある方はまだほとんどいないのではないでしょうか。

OpenIDによる認証を提供するサービスが増え、インターネット上でアカウントを持つ人の多くがOpenIDを利用できるようになっています。 さらにOpenIDを扱うPerlやRubyなどのライブラリも充実してきています。 このように、OpenIDを使うための環境は整ってきていると言えます。 そこで、本連載では実際にOpenIDを使ってみながら、その仕組みについて解説していきます。 同時に、仕様では見えてこないOpenIDを使う上でのコツも、説明していければと思います。

OpenIDとは

OpenIDとは、いったい何でしょうか。 OpenIDの公式サイトには、以下のように書かれています。

OpenID is a free and easy way to use a single digital identity across the Internet.

「1つのIDをインターネット上で無料かつ簡単に使うための仕組み」ということですが、端的に言うとYahoo!やはてな等のアカウントを使って、他のサイトにログインすることができるようになります。 ⁠IDを1つにする」という考え方は以前からありましたが、OpenIDはそれまでの考え方と何が違うのでしょうか。

大きな違いは認証サービスが分散していることです。

集中型の認証APIと分散型のOpenID

WebではBlogやWebメールなどの、様々なサービスが提供されています。 これらのサービスを使うためには、それぞれに登録したIDとパスワードを使って認証していることと思います。 ですが、利用するサービスが増えると、サービスごとのユーザ登録が面倒になったり、IDとパスワードが増えて覚えきれなくなるという問題が発生します。

この手の問題は古くから存在しており、イントラネットなどの利用者が限定される環境では、WindowsのActive Directoryなどのようにディレクトリを用いて利用者の情報を集中的に管理する方法が採用されています。

Webでも、次に挙げるように、いわゆる「認証API」と呼ばれるユーザ認証の仕組みが各社から提供されています。

  • TypeKey認証
  • はてな認証API
  • livedoor Auth
  • JugemKey認証API

これらは、それぞれのサービス提供者のユーザIDで、他のサイトへログインするための仕組みです。 しかし、不特定多数の利用者やサービス提供者が存在するWebでは、認証というサービスの基盤に関わる機能を特定のサービスに任せることへの心理的な抵抗感があり、広く普及するところまでは至っていません。 かといって、複数の認証APIに対応するためには、それぞれの認証APIとのインタフェースを作り込む必要があり、そのためのコストがかかってしまいます。 そこで、特定の認証サービスに依存しない仕組みとして、OpenIDが着目されるようになってきました。

従来の集中型の認証APIと異なり、OpenIDでは複数の認証サービスが存在します。 OpenIDに対応した認証サービスを提供しているところであれば、どの認証サービスでも使用できます。 複数の認証サービスが混在できるように、OpenIDではユーザIDとしてURLを用います。 例えば、筆者のはてなでのOpenIDアカウント名は以下のようになります。

http://www.hatena.ne.jp/kmachu/
従来の認証APIの場合:
図1-1
OpenIDの場合:
図1-2

ただし、すべての認証サービスですべてのOpenID対応サイトにログインできるとは限りません。 対応サイトによっては、受け入れる認証サービスを制限しているところもあります。

また、OpenIDはユーザを認証するための仕組みを提供しますが、認証されたユーザが信頼できるかどうかは別問題です。 特に、誰でも認証サービスを提供できるという仕組みであることから、認証サービスによって信頼性はまちまちです。 ユーザ登録時にCAPTCHAやメールの到達確認を行うことでbotやスパマーの登録を防いでいる認証サービスもあるでしょうし、誰でもすぐに登録できてしまう認証サービスもあるかもしれません。 今のところ、どの認証サービスを信用するかは、利用者やOpenID認証を受け入れるサイト次第と言えます。

OpenIDの主な用語

最低限覚えておきたい、OpenIDで登場する用語は次のとおりです。より詳しくは、OpenIDの仕様書@ITでのOpenIDの仕様と技術などを参照してください。

OP(OpenID Provider)
OpenIDによる認証サービスの提供者です。
RP(Relying Party)
OpenIDによる認証を受け入れるサイトです。
Claimed Identifier
利用者のOpenIDアカウント名。本連載では便宜的に「OpenIDアカウント」と呼びます。

OpenIDでの認証の仕組み

認証サービス(OP)のOpenIDアカウントで別のサイト(RP)へログインするときの流れについて説明します。

OpenIDでのログイン
図2
  1. 利用者はRPにアクセスし、自身のOpenIDアカウント(Claimed Identifier)を入力します。
    ※後述しますが、利用者はClaimed Identifierの代わりにOPのURL(OP Endpoint)を入力することもあります。これらを総称して、ユーザ提供識別子(User-Supplied Identifier)と呼びます。
  2. RPは入力されたOpenIDアカウントを元に、OPを探します。
  3. RPはOPとの間で、共通鍵を交換します。この鍵はOpenIDメッセージの改ざん防止に使われます。
  4. RPは利用者をOPへとリダイレクトし、利用者の認証を要求します。
  5. 利用者はOPにログインしていなければ、IDとパスワードでOPへログインします。OPはOpenIDアカウント名をRPへ通知していいかどうかを利用者に確認します。
  6. 利用者がアカウントの通知に同意すれば、OPは利用者をRPへとリダイレクトして、認証結果をRPへと通知します。
  7. RPは受け取った認証結果に含まれるClaimed Identifierで、利用者を認証します。

流れだけを見るとなんだか複雑そうに見えるので、実際のサービスで試してみることにしましょう。

Yahoo!のOpenIDアカウントでFastladderにログインする

では、すでにOpenIDに対応しているOPとRPを使って、実際に試してみましょう。 OPには「Yahoo!」「はてな」を、RPにはFastladderを選びました。 Fastladderは日本でよく使われているRSSリーダであるLivedoor Readerの海外版です。 英語のサービスですが、RPとしてよく考えられて作られているので、例として取り上げました。

それぞれのサービスについては、以下のページを参照してください。

Fastladderへのログイン

ではまず、はてなのIDを使ってFastladderにログインしてみます。 Fastladderのサイトを開くと、Fastladderのログイン画面が表示されます。

図3

Fastladderでは通常のIDとパスワードによるログインと、OpenIDによるログインの両方が可能になっています。 すべての人がOpenIDを使える訳ではない現状では、従来のログイン方法も提供することは現実的な選択だと思います。

さて、ログイン画面のSign in with OpenIDと書かれた欄に、はてなのOpenIDアカウント(Claimed Identifier)を入力します。筆者のはてなIDはkmachuですので、OpenIDアカウントはhttp://www.hatena.ne.jp/kmachu/となります。

IDを入力して、[Sign in/Create Account]ボタンを押すと、はてなのサーバへとリダイレクトされて、はてなのログイン画面が表示されます。 なお、既にはてなにログイン済みであれば、このログイン画面は表示されません。

図4

ログイン画面でIDとパスワードを入力して、はてなにログインします。 ここがOpenIDのポイントですが、FastladderにはてなのIDとパスワードを渡しているのではなく、はてなのログイン画面でIDとパスワードを入力します。

はてな以外のサイトにはてなのIDとパスワードを渡してしまうと、そのサイトにパスワードを不正利用される恐れがあります。 すなわち、OpenIDではOPのIDとパスワードをRPへ渡す必要はありません。 したがって、ちゃんとアドレスバーをみて、はてなのURLであることを確認してから、IDとパスワードを入力することが大切になります。

ちなみに最近ではYahoo!Japanのログインシールのように、事前に設定した画像や文字をログイン画面に表示するサイトも増えています。

さて、IDとパスワードを入力してはてなにログインすると、Fastladderに自分のIDを渡していいかどうかの確認画面が表示されます。 ここで重要なのは、RPにIDを渡すかどうかは「利用者」が決定することです。 もし利用者の同意なしにどのRPへもIDを渡すようなOPを使用していると、意図しないところで利用者の行動が追跡される恐れがあります。

図5

確認画面で「今回のみ許可」もしくは「常に許可」を選ぶと、Fastladderの画面に戻ります。 ⁠常に許可」を選ぶと、次からはこの確認画面が表示されなくなります。 どちらかのボタンを押した時点で、入力したOpenIDアカウントがはてなからFastladderへと送られます。 OpenIDの欄にhttp://www.hatena.ne.jp/kmachu/というアカウント名が表示されています。

図6

初めてFastladderを利用する時には、OpenIDでログインするとユーザ登録画面が表示されます。 ここで、OpenIDとは別にFastladder内部で利用するユーザIDを登録します。 つまりFastladderではOpenIDのアカウントで利用者を識別するのではなく、OpenIDアカウントと別途登録したユーザIDを結びつけて管理しています。 このように、グローバルなOpenIDとローカルのIDを結びつけることで、以下のようなメリットが生まれます。

  • Fastladderの画面に表示するIDをシンプルにできる
  • 1つのローカルIDに複数のOpenIDアカウントを結びつけることができる
  • OpenIDを使う利用者と通常のIDとパスワードを使う利用者を同じように扱える

OpenIDは利用者の認証を外部のサービスに任せる仕組みです。 外部のサービスに依存することのメリットもありますが、そのサービスが落ちているとログインできないというリスクもあります。 そこで、利用するOpenIDアカウントを複数登録できるようにすることで、特定のサービスへの依存度を下げることができます。 Fastladderでも、アカウントの設定画面で追加のOpenIDアカウントを登録することができます。

図7

複数のOpenIDアカウントを登録することで、一つのOPがダウンしていても他のOPを使ってログインすることができます。 反面、複数のOpenIDアカウントを登録するということは、それぞれのOpenIDアカウントでの名寄せが可能になるということなので、利用者は注意して登録する必要があります。

ところで、Yahoo!のOpenIDは、名寄せを防ぐためにランダムなアカウントを発行するという興味深い仕組みになっています。 次はYahoo!のOpenIDを使ってFastladderにログインしてみましょう。

利用者がOpenIDのURLを入力せずにログインする

OpenIDではアカウント名にURLを用いているため、どうしてもIDが長くなってしまいます。 ログインする時に長いIDを入力するのは面倒です。

OpenID 2.0では、自分のアカウント名ではなく、代わりにOPのドメイン名を入力することができます。Yahoo!はOpenID 2.0に対応していますので、今度はYahoo!のアカウントでFastladderにログインしてみます。

Fastladderのログイン画面にて、OpenIDの入力フィールドにyahoo.comとだけ入力して「Sign in/Create Account」ボタンをクリックすると、Yahoo!のログイン画面が表示されます。 なお、Fastladderでは「SignIn with a Yahoo! ID」というボタンも用意されていて、Yahoo!に限ってはOPのドメイン名すら入力が不要になっています。

Yahoo!のIDとパスワードを入力してログインすると、はてなの時と同じようにOpenIDアカウントをFastladderへ通知してよいかどうかの確認画面が表示されます。

図8

「Let Me In」ボタンをクリックすると、fastladderへYahoo!のOpenIDアカウント名が通知されます。 このようにOpenID 2.0では、利用者がOpenIDアカウント名を入力する代わりに、OPのドメイン名を入力してログインすることも可能になっています。

Yahoo!が提供するOpenIDサービスの特徴

Yahoo!のOpenIDサービスには、いくつかの特徴的な点があります。このことはOpenID 2.0の仕様とは関係ない話ですが、OpenIDを活用する際に重要なポイントですので言及しておきます。

1.OpenIDアカウントからYahoo!アカウント名を推測できない

まず1点目は、RPに通知されるOpenIDアカウント名からYahoo!のアカウント名が推測できないということです。

先ほどの例では、Fastladderに通知されるOpenIDアカウント名は、以下のようになります。

https://me.yahoo.com/a/uApmfVQxtei1p6bQQrTX5UpaGBZbraYj#a6222

この文字列からYahoo!のアカウント名は分からないようになっています。

これは、Yahoo!のアカウント名がメールアドレスやメッセンジャーに使われるセンシティブな情報だからでしょう。OpenIDでログインするだけで、そのサイトからYahoo!のメールアドレスに勝手にメールが送られると困りますよね。

2.RPに通知するOpenIDアカウント名を選択できる

一方でYahoo!では利用者の選択によってRPに通知できるアカウント名を変更することができます。

例えば、Yahoo!が運営するFlickrという写真共有サイトのURLを、OpenIDのアカウントにすることが可能です。OpenIDでログインする時には、アカウント名が推測できないランダムな文字列と、自分で変更したアカウント名のどちらを通知するかを、利用者が選択できるようになっています。

図9

まとめ

OpenIDのログイン方法には、以下の2種類がありました。

  • OpenIDのアカウント名を入力してログインする(はてなの例)
  • OPのURLを入力してログインする(Yahoo!の例)

また、OpenIDの仕様では決められていないことですが、Fastladderでは以下のような工夫をしていることがわかりました。

  • 既存のIDとパスワードによるログインと、OpenIDによるログインを選択できる
  • OpenIDアカウントとは別に、ローカルのユーザIDを登録できる
  • 1つのローカルのユーザIDに、複数のOpenIDアカウントを登録できる

さらに、Yahoo!はOPとして以下のような工夫をしていました。

  • 標準でのOpenIDアカウント名からはYahoo!アカウント名を推測できない
  • RPに通知するOpenIDアカウント名を利用者が選択できる

このような点が、実際にOpenIDアカウントを受け入れるサービスを作る際のポイントになりそうです。

OpenIDの概要がなんとなく把握できたところで、次回はOpenIDライブラリを使って簡単なRPのサンプルを動かしてみましょう。

おすすめ記事

記事・ニュース一覧