JSPで行こう!

OpenID との関係

OAuth2.0 と OpenID Connect との関係についても見ていきます。

OAuth2.0 はOpenID Connect を含んでいる

OAuth2.0 では、OpenID Connect の仕様を取り入れているので、おのずと使えます。
Google のOpenID Connect についての解説では、

GoogleのOAuth 2.0 APIは、認証と認可の両方に使用できます。

とあります。OAuth2.0 は「認可」つまり、「私のどこどこの情報は見て良い」というような許可や権限も含んでいますので、
単純な「認証」つまり「これは本当に私です」という範囲を超えています。

Google でログインした後にさらに「許可」ボタンを押すのに抵抗感を感じるのはその為です。

OAuth2.0 で OpenID Connect を使うには少しだけ手順が違います。
純粋に、OpenID Connect だけ使う手順は、
  1. Create an anti-forgery state token
  2. Send an authentication request to Google
  3. Confirm the anti-forgery state token
  4. Exchange code for access token and ID token
  5. Obtain user information from the ID token
  6. Authenticate the user
1.はCSRF(不正要求攻撃)対策の為の準備です。(必須ではありません)
ランダムな文字列を生成して、後で照合することで、正規の要求かを判別します。
2.は Google に認証を依頼する操作ですが、例を見たほうが理解しやすいと思います。
https://accounts.google.com/o/oauth2/v2/auth?
 client_id=424911365001.apps.googleusercontent.com&
 response_type=code&
 scope=openid%20email&
 redirect_uri=https://oauth2-login-demo.example.com/code&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps://oauth2-login-demo.example.com/myHome&
 login_hint=jsmith@example.com&
 openid.realm=example.com&
 nonce=0394852-3190485-2490358&
 hd=example.com

URL は Google+ の認可のものと同じです。
scope が違います。特に、ここでは"openid"と"email"の2つの情報を取得します。(スペースで区切る)
OpenID を要求しているところが、認可を使う場合と異なるところです。
また最低必要なものは、

です。実際に実行してみると、認可画面は表示されず、
正しいパスワードを入力した時点で、リダイレクト先が呼ばれます
これならば、抵抗は少ないですね。

3.は、CSRFの確認です。
パラメータとして渡されるので、自分で1.で設定していた場合は、同じ値か確認します。

4.でアクセストークンを取得します。手順は Google+ やカレンダーの認可と同じです。
異なるのが、IDトークン("id_token")も返ってきます。

5.でユーザー情報を取得します。
取得した IDトークンですが、JWT という形式で符号化されています。復号すると、いろいろな情報があり、
その中にユーザー情報も含まれています。
復号については、Yahoo!の記事 が判り易かったです。
大事な点は、送られてきた内容が書き換えられた不正なものでない事を"署名"で確認することです。
ユーザー認証としては、これだけで完結します。

6.アプリケーション側で、ユーザー登録処理
正しい情報と判れば、自身のデータベースと照合して、既にユーザー登録があれば続いて処理を実行し、
無ければ、ユーザーの新規登録画面へ進むことになります。
これで完了です。

これだけで終わり?

あれ?何か忘れているような・・・
そうです、アクセストークンを使ってないですね。
リンクの Google の解説では、さらに続きます。
結局は、アクセストークンは追加のユーザープロフィールを取得する為に使うようです。

取得した「IDトークン」の中身は認証元(例えばGoogle)によって返される中身が多少違います。
ある認証元では認証されたという事まではわかるのですが、「誰?」という情報までは含まれない場合もあります。
また、「IDトークンの署名の確認」とさらっと書きましたが、厳密に行おうとすると結構大変なようです。
特に、暗号アルゴリズムを複数サポートしたりとか、自力で行うには少々敷居が高いようです。
Google では、email も含める事が出来るので、email がユーザーIDになるようなシステムでは、
IDトークンの検査だけで終わらすことが出来るかも知れません。

"そうしろ"とは書いてありませんが、結局は、アクセストークンを使って、追加情報として取得するほうが、
簡単だろうと思ったりします。

« 前頁 次頁 »