【決定版】Twitter APIにも使われるOAuth認証のしくみ
Twitter用の自作BotをPHPで作る際に勉強したんですが、なかなか複雑で理解するのに時間がかかってしまいました。 理解度を確認する意味でも、自作のWebアプリにユーザーのTwitterアカウントを紐付けてTwitter APIを利用するシーンを想定して解説してみようと思います。
「アクセス・トークン(Access Token)」をTwitterから得るのが目標です
OAuthによる認証がうまくいくと、Twitterのような既存のサービスで管理されているユーザーアカウントを自分のWebアプリ上とも共有できるようになります。
そのためには、ユーザーごとに「アクセス・トークン(Access Token)」というものをユーザー情報管理サービス側(今回の場合はTwitter)から発行してもらう必要があります。
アクセス・トークンとは何ぞ?
アクセス・トークンというのは、Twitterへツイートする際にログインする場合のアカウント情報(ユーザーID+パスワード)を暗号化してまとめた文字列です。
OAuthというのは、ユーザーアカウント情報を共有して、提供されているAPIを利用できるようにするしくみなのですが、Twitter側からしたら、共有とは言えどID+パスワードをそっくりコピーさせるわけにはいきません。
そんなことをしたら、セキュリティ・リスクになったり、ユーザーがパスワードを変えたい場合も1箇所ではすまなくなったりで大変なことになってしまいます。
あくまで自作のWebアプリが得られるのは、ユーザーアカウントのショートカット(エイリアス)情報みたいなものだけです。 それがアクセス・トークン。
アクセス・トークンはユーザーごとに異なる
Webアプリにアクセス・トークンを記憶させておけば、ユーザーID+パスワードがなくてもユーザー認識できるわけなんですね。 ユーザーID+パスワードの代わりに使える。
つまり自作のWebアプリ経由でツイートなんかもさせることができるわけです。
でも、この「アクセス・トークン」はすぐに得られるわけではありません。 当然ながらアクセス・トークンはWebアプリを利用するユーザーごとに異なった文字列だからです。
Botアプリを作る人は、事前にアプリケーション登録をしたユーザー情報から簡単にアクセス・トークンを取得できます。
ではどうしたらアクセス・トークンを得られるのか?
サルでも分かる「アクセス・トークンを得るための3ステップ」
ステップ1:合言葉(リクエスト・トークン)を発行してもらう
今までTwitterサイトでツイートしていたユーザーであってもそうでなくても「Webアプリを使ってツイートするから」ということになるわけですから、新たにTwitterに申請する必要があるんですね。
申請するようにユーザーに促すのはWebアプリ側の作業になります。
Webアプリ側は、申請からアクセス・トークンを得られるまでの作業をユーザーが秘密裏に行えるように、Twitterに対して「リクエスト・トークン(RequestToken)」という合言葉を発行してもらうようにお願いします。
さしずめ「開けゴマ!」みたいなものですね。 合言葉自体はWebアプリ側からは決められません。 残念(笑)
で、このリクエスト・トークンはWebアプリがTwitterからアクセス・トークンを発行してもらうまでの間、通信の際に合言葉として使われていくのです。
ステップ2:ユーザーを申請する
次は、利用するユーザーをTwitterに申請します。
これもWebアプリの作業なんですが、Webアプリを利用するユーザーを申請するためのページをTwitterに教えてもらいます。
Twitterはリクエスト・トークンの情報を利用して申請ページを作ってWebアプリ側へ伝えます。 Webアプリ側はユーザーにそのURLを教えて誘導してあげるわけです。
ステップ3:証明情報を申請してようやくアクセス・トークンをゲット!
ユーザーが申請ページでWebアプリ利用を許可すると、Webアプリが事前に設定しておいたページ(コールバック・ページ)に戻ってきます。
そのときに申請が完了した証明情報(OAuth Verifier)が付いてくるので、あとは前から持っていた合言葉(リクエスト・トークン)と証明情報(OAuth Verifier)をもってTwitterにアクセス・トークンを要求します。
すると、Twitterからアクセス・トークンが返ってくるので、ユーザーごとにデータベースに保存して、Webアプリで利用できるようにします。
以降は、このアクセス・トークンさえあればWebアプリ経由でTwitterにツイートしたり、ユーザーのプロフィール情報を取得したりすることができるようになります。
以上! 分かりやすく説明してみたつもりですがどうでしたか?
2010-09-04