とある事情で認証・認可について学ぶ必要があったので、学んだことをまとめていこうと思います。
前提知識
まず前提知識となる用語の解説から学んでいきました。
この2つの記事が大変参考になり分かりやすかったです。
用語の説明 & 例え話で理解が進みやすいのはこちら
https://dev.classmethod.jp/security/authentication-and-authorization/
webサービスの例も交えており、より例が具体的で分かりやすいのはこちら
https://qiita.com/TakahikoKawasaki/items/f2a0d25a4f05790b3baa#%E8%AA%8D%E8%A8%BC%E3%81%A8%E8%AA%8D%E5%8F%AF
認証(authentication)とは
認証とは、その人がその人自身であることを確認する行いです。
ポイントとしては、認証とはあくまで確認だけに留まり、その人にある権限とは関係がありません。
例えば、会社によっては社員証と会社に入館できる磁気カードが分かれていたりすることがあります。
社員証ではその人が会社の社員であることの証明を行うことができますが、
磁気カードを家に忘れてしまった場合は入館はできません。
認可(authorization)とは
認可とは、その人に権限を付与する行いです。
先の例で言えば、磁気カードを自分ではない他人が入手した場合、
その人が「社員の○○さんであるか」とは関係なく会社に入館することができてしまいます。
「社員の○○さんである」ことと、○○さんの所属する「会社に入館できる」ことはそれぞれ、「認証」・「認可」という意味では関係はありません。
実際に作ってみる
ある程度意味を掴んだところで実際に作って確かめるためにオレオレOAuth認証を行うプロバイダーと、
プロバイダーサーバで認可された後に利用することができるクライアントサーバを作ってみました
やりたいことは下記のようなイメージです
構築の流れはこちらに記載しています。
いずれのサーバもlocalで起動させており、プロバイダーサーバは300ポート、Clientsサーバは3001ポートで動いています。以降の内容は、全て下記ページで構築したアプリケーション上で動作することを想定しています。
https://qiita.com/moehiko/items/300dcfa4d8f70660bcd1
①クライアントサーバ:認可サーバへアクセス
まずClientサーバにアクセスします。
http://localhost:3001/users/sign_in
「Sign in with Mock」をクリックすると、プロバイダーサーバの、認証を求める画面に遷移します
※今回は「Mock」が他のAOuth認証で言うところのFacebookと思ってください
②プロバイダーサーバ:認証
下記ページに遷移し、プロバイダーサーバでの認可を行うために認証を行います。
http://localhost:3000/users/sign_in
③プロバイダーサーバ:アカウントに認可を与える
認証後、ログインしているアカウントに対し、mockを使ってクライアントサーバへアクセスできるようにする認可を与えるかの確認を求められます。
④プロバイダーサーバ → クライアントサーバへリダイレクト
認可を与えるとクライアントサーバへリダイレクトされます。
http://localhost:3001/home
クライアントサーバへリダイレクトされ、コンテンツが表示されました。
ちなみに、ログインしない状態でこのページにアクセスすると、①の画面に戻されるようになっております
おわり
以上でAOuth認証サーバを作ってみて、認証・認可の仕組みを学んでみたまとめは終わりとなります。
意味を学ぶのは先人の記事もあり、作ってみてしっかりと理解するのはなかなか大変ですね・・