やなぎにっき

学んだことの記録

「GitHubでログイン」の流れをざっくり理解する

これは「フィヨルドブートキャンプ Advent Calendar 2020」の10日目の記事です。
フィヨルドブートキャンプ Part 1 Advent Calendar 2020 - Adventar

昨日は Yusuke さんの【Ruby】puts病の私がメソッド化を少しできるようになった話 でした。

Part2 はこちら
フィヨルドブートキャンプ Part 2 Advent Calendar 2020 - Adventar

概要

私は現在Webエンジニアになるためにフィヨルドブートキャンプで勉強をしています。

フィヨルドブートキャンプでは「omniauth を使って GitHub 認証を実装する」というRailsのプラクティスがあります。
私は今このプラクティスを進めているのですが、今までのプラクティスで1番難しいと感じているところです。

というのもOAuthの理解がなかなか出来なかったためです。
OAuthをなぜ使うのか・どう手順を踏んでいるのか理解しようとするも、初めて見る単語や用語が多く、ドキュメントや記事も読んでもなかなか頭に入りませんでした。
「リソースサーバー」「認証サーバー」「アクセストークン」……?
今ではなんとか用語とその関係が理解ができたものの、そこまでに2,3日はかかってしまいました。

自分が「OAuthのことをまったく知らない」状態から「OAuthがなんとなく理解できた」状態になっただろうと考えてみると、「リソースサーバー等の言葉を使わず」に「身近なところで何が行われているのか」をざっくり知ることなのではないかと考えました。

そこで今回は「GitHubでログイン」ボタンを押してからログインが完了するまでにどのようなことが行われているのか、「リソースサーバー」等の言葉を使わずにできるだけ簡略化した形で説明してみます。

※この記事の説明はざっくりした内容に留まります。初心者が書いたもので正確性には欠けるのでご承知ください。致命的な間違い等あればご指摘ください!

Github認証ができるまで

AさんがGithubのアカウントでなんらかのアプリケーションをログインしたいとします。
Qiitaでいうとログインページのこのボタンです。 f:id:yana_g:20201209161244p:plain ログインボタンを押してからログインが完了するまでにどのようなことが行われているのか、ざっくり見ていきます。

登場人物

今回の登場人物です。 f:id:yana_g:20201209185233j:plain

AさんGithubとアプリケーションのユーザー
〇〇アプリGithubのアカウントでログイン機能を持つアプリケーション
GitHub:ログイン機能を提供するプロバイダー

※OAuthのドキュメントや記事では次のような言葉で説明されることが多いです。
今回は「ざっくり流れを理解する」ことが目的なので、上記の呼び方で説明していきます。
Aさん:エンドユーザー
〇〇アプリ:クライアント
Github:リソースサーバー

※本来はリソースサーバーと認可サーバーは独立して考えますが、今回は同一サーバーという想定で説明します。

GitHubでログインができるまでの流れ

f:id:yana_g:20201209185315j:plain 1. Aさんが〇〇アプリの「Githubのログインボタン」を押します。
2. 〇〇アプリはGithubに対してAさんのアクセス権を要求します
f:id:yana_g:20201209185333j:plain 3. GithubはAさんに対して「Githubへのアクセス権をアプリに委譲すること」についてAさんに確認します。
それがこの画面です。(アプリは自分が作成したテスト用のもの)
f:id:yana_g:20201209153819p:plain 4. Aさんは権限委譲に同意します。 f:id:yana_g:20201209185354j:plain 5.Githubは権限が委譲された証として、「Aさんの代わりにアクセスできる許可証」(=アクセストークン)を発行し〇〇アプリに渡します。

f:id:yana_g:20201209185408j:plain 6. アプリは許可証(アクセストークン)を持ってAさんのプロフィール情報にアクセスするを要求します。
f:id:yana_g:20201209140941j:plain 7.Githubは許可証(アクセストークン)の有効性と権限が正しいか確認し、問題がなければ〇〇アプリにAさんのプロフィール情報を渡します。

f:id:yana_g:20201209185421j:plain 8. 〇〇アプリはGitHubからもらったプロフィール情報を元にログイン処理を行い、ログイン後の画面を表示させます。

以上がGitHubでログインするざっくりとした流れになります。

OAuthとは結局なんなのか

OAuthは許可証(アクセストークン)を使ってIDとパスワードを渡さずに「特定のデータへの操作を許可」(=認可)する仕組みのことです。
図で言うとここです。

f:id:yana_g:20201209185441j:plain IDとパスワードで「本人確認」(=認証)する仕組みではありません。
ですがGitHubはプロフィール情報を提供するAPIがあり、アプリはこのAPIから取得したユーザー識別子の情報などを利用し、OAuthでの認証を可能にしています。
(ここ説明が適切か自信ないです……)

さいごに

自分がやっと理解できたと思った内容も、いざ説明してみると想像以上に難しかったです。(簡単な言葉で説明しようとなるとなおさら……!)

色々な資料を読んでみて認証まわりのことをもっと知りたいと思ったところなので、将来もっといい記事が書けるように頑張ります。

参考

雰囲気でOAuth2.0を使っているエンジニアがOAuth2.0を整理して、手を動かしながら学べる本 - Auth屋 - BOOTH

OAuth、OAuth認証、OpenID Connectの違いを整理して理解できる本 - Auth屋 - BOOTH

Authorizing OAuth Apps - GitHub Docs

GithubのOAuth2.0の仕様について理解する(Githubログイン) - ぺい
OAuth 2.0 の解説サイトを漁る前に - Qiita