本記事は ディップ with 全部俺 AdventCalendar 9日目の記事です。
今回はOAuth2で定義されている認可グラントの中から認可コードについてどのような動きになっているかみたいな部分を書いていこうと思います。
例として、google OAuth2認証を使います。
※Google OAuth2自体の設定は済ませてある前提で話を進めます。
サンプルソースは下記
What is OAuth2
OAuth2とはここに詳しく書いてあるぞ!
OAuth2には認可グラントとして、4つのロール 認可コード
、 インプリシット
、 リソースオーナーパスワードクレデンシャル
、 クライアントクレデンシャル
を提供します。
今回はこの中から認可コードについてざっくり解説していこうと思います。
認可コードとは?
認可コードは, 認可サーバーがクライアントとリソースオーナーの仲介となって発行する。 リソースオーナーへ直接認可を要求する代わりに、クライアントは ([RFC2616] に定義されたユーザーエージェントを経由して) リソースオーナーを認可サーバーへリダイレクトさせ, リソースオーナーがリダイレクトして戻ってきた際に認可コードを取得する。
ということで、一度クライアントからサーバサイドへredirectが入り、サーバサイドでアクセストークンを取得するような仕組みになっています。
sampleの実装を見てみよう。
何はともあれまずログインしてみなきゃ始まりません。
Googleのログイン画面が表示されるまで。
php -S localhost:8080
でサーバを立てます。
index.phpにアクセスすると、未ログイン状態の画面が表示されます。
ここでヘッダーの OAuth Sign in
をボタンをクリックします。
このボタンはGoogleの認証用のURLとなっており、払い出されたclient_idなどからgoogleのログイン画面を表示します。
※Chromeログインをしている場合等は簡易のアカウント選択画面になったりします。
ポイントはGoogleログインの画面はこちら側で実装したものではなく、Google側が用意したものであるということです。
※googleのID、Passwordをこちらのシステムに保持することなく、ログイン出来たよということがわかる。
ログインが成功した後の挙動
ログインが成功するとgoogleログイン画面からHTTP status 302とともにredirect用のURLが返却されます。
sampleコードではcallback.phpが実行されます。
redirect用のURLは事前に登録したもので、このredirect用のURLの後ろにGoogleからパラメータが付与された状態で返却されます。
ブラウザは302のステータスを受け取るとそれと一緒に付与されているredirect用のURLに対してリクエストを行います。
このリクエストによって、ブラウザクライアントからサーバサイドのプログラムに「これこれこういうパラメータが帰ってきたよ。」と通達します。
このパラメータの中に 認可コードが含まれます。
認可コードはアクセストークンよりも短いライフサイクルのワンタイムコードです。
サーバサイドのプログラム callback.php
はこれを受け取り、googleのtoken用URLにこの認可コードを送信します。
googleはこの認可コードを検証し、問題がなければ晴れてアクセストークン等の認証情報を返却します。
アクセストークンを受け取った後は?
アクセストークンを受け取った後はプロバイダ(ここでいうgoogle)と握った範囲のデータを参照したり、更新したり、追加したりすることが出来ます。
この参照、追加更新に関してもプロバイダと握った権限が適応されます。
良くTwitter連携アプリのTwitter認証画面でこのアプリは〜〜することが出来ます。
といった注意書きがされているのはこの握った範囲はこれですよというものです。
googleでサインインと言うような形でユーザ登録したときに、googleログインしただけでプロフィールに名前やメールアドレスが自動的に入力されているのはこの 握った範囲のデータ
を参照し入力しているからとなります。
まとめ
仕組みを知り、ライブラリを利用しない実装を行うことで、ライブラリの中で大まかにどういうことが行われているかがわかるようになります。
特にOAuth2は、一つわかってさえしまえば、他のプロバイダの認証も基本的に同じことになるので、ライブラリでは提供されていないプロバイダについても自分で追加していくことが出来ます。
実際に手を動かしながら確認することで、より理解を深められると思いますので、ぜひ一度やってみてください。