背景 🖼️
こちらの本でOAuthについて説明されていました。
また、業務でGoogle、Microsoftを使ったログインをしているのでそれとも関係しているのかなと思いました。
改めて概要を理解したいと思います
認可とは 💡
リソースにアクセスする為の認可を得る
何ができるか(リソースを利用すること)を許可する仕組みのこと
OAuthとは 💡
リソースを持つサービスAがそのリソースを利用したいサービスBにそのリソースを利用することを許可する仕組みのこと
OAuthのイメージ図を以下に示します。
- サービスBがサービスAに登録しているユーザーMの情報を使用したいとリクエストをします
- サービスBがサービスAのユーザーMの情報を利用することの許可をユーザーMに求めます
- ユーザーMが許可します
- サービスAに登録しているユーザーMの情報にアクセスする為のトークンをサービスBへレスポンスに乗せて提供します
サービスBはこのトークン(アクセストークン)を使うことでサービスAにあるユーザーMの情報を利用できるようになります。
OAuthの実例 🕵️♀️
Qiitaの認可画面
- FindyがQiitaに登録してあるユーザー情報を利用することの許可するか確認しています
これはまさにOAuthだとわかります。
https://qiita.com/api/v2/oauth/authorize?client_id=~~
この認可画面のGETリクエストのクエリパラメータには以下がありました。
| パラメータ | 例 | 意味 | 説明 |
|---|---|---|---|
| client_id | abcdefg | クライアントのID | 認可を求めているサービスB(クライアント)が何者かを特定するもの |
| scope | read_qiita read_qiita_email_address | 権限(アクセス範囲)の指定 | サービスB(クライアント)がサービスA(Qiita)のどのリソースにアクセスできるかを指定する |
| redirect_uri | https://findy-code.io/auth_callback/qiita | リダイレクトURL | 認可が完了したあとに、ユーザーを戻すクライアント側のURL |
| state | {"securityToken":"------"} | ランダム値のトークン | クライアントが生成して認可リクエストに付与。サービスAがリダイレクトで返すことで、リクエストとレスポンスを突き合わせ、改ざんやセッション固定攻撃を防ぐ |
client_idは認可を求めているサービスB(クライアント)が何かを特定するIDです。
client_idは同じクライアントであれば同じ値でした。
実際に他のクライアントであるlaprasからQiitaに認可を求めるとclient_idは別の値でした。
OAuthは標準化されていて広く認知されている仕組みなので、様々な言語でライブラリが用意されています。
次に実際にGoogle OAuthに認可を求めて、Google Calendar APIからデータを取得する仕組みを作ります。
今回は業務で使っているGoでクライアントアプリを作成します。
Google OAuthに認可を求めて、Google Calendar APIからデータを取得する概要 🖼️
Google OAuthはOAuth2.0を採用しています。
保護対象リソース;リソースを持つサーバー、トークンを受け取るとリソースへアクセスできるようにする
認可サーバー;クライアントアプリのリソースサーバーへのアクセスの認可、トークン発行を担当する
クライアント:保護対象リソースによって提供されるAPIを利用するソフトウェア全てのこと
The authorization server may be the same server as the resource server or a separate entity
認可サーバーはリソースサーバーと同じサーバー上にあってもよいし、別々のサーバーとして分離されていてもよい。
先ほどの概念図に語句を追加すると以下のようになります。
イメージが掴めたところで次にGoogle Calendar API,Google OAuthの同意画面の設定をします。
Google Calendar APIの有効化の設定 ⚙️
以下画像の順で設定しました。
OAuth同意画面の設定 ⚙️
以下画像の順で設定しました。
Goでクライアントアプリを実装する 🏃♀️
こちらで実装しました。
Google OAuthの認可画面にアクセスする 👍
localhost:8000/auth
https://www.googleapis.com/calendar/v3/users/me/calendarListのGETリクエストで取得したjsonが返されます。
最後に
- OAuthの概要が掴めました
- 次回は以下を整理したいです
- OAuth2.0とOAuthの違い
- OIDCについて、OAuthは認可のみの認識だが認証もしていることについて
この本をしっかり読み込んでみたいと思います。
長い記事になってしまいましたがここまで読んで頂きありがとうございました。
参考 📚























