OAuth2 は、渡す物を権限と期限を限定したトークンに置き換える手続きの規格。ホテルに車を預けるとき渡すのは、トランクが開かないバレーキーであってキーホルダーごとではない。
① ユーザーが承認する
アプリが GitHub の画面へ飛ばす →「このアプリにリポジトリ読み取りを許可しますか?」
★ パスワードを入力するのは GitHub の画面。アプリは見ていない
↓ 承認の証拠(認可コード)を持って
② GitHub がトークンを発行する
「読み取りだけ・1時間有効」のアクセストークンをアプリに渡す
↓ そのトークンを持って
③ アプリが API を叩く
Authorization: Bearer <トークン> ← ここから先は Bearer の話
キモは①。パスワードを入力する画面が GitHub 自身であって、アプリではない。「GitHub でログイン」「Google でログイン」ボタンの裏側は毎回この手続き。
③ を見ればわかるとおり、OAuth2 のゴールは Bearer で渡せるトークンを手に入れること。3つが同時に成立するのはこのため。
名前に Auth と付くが、OAuth2 が決めているのは「何をしていいか(認可)」の委譲手続きで、「あなたが誰か(認証)」ではない。
「Google でログイン」が本人確認として成立しているのは、上に OpenID Connect という別の規格が乗っているから。OAuth2 単体では本人確認にならない。