1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OAuthの概要を理解する 🔑

Last updated at Posted at 2025-09-13

概要 ✨

  • 認可とは何ができるか(リソースを利用すること)を許可する仕組みのこと
  • OAuthとはリソースを持つサービスAがそのリソースを利用したいサービスBにそのリソースを利用することを許可する仕組みのこと
  • Google OAuthではOAuth2.0を採用しており、認可サーバーと保護対象リソースで役割を分離している

この記事では実際にGoogle OAuthに認可を求めて、Google Calendar APIからデータを取得する仕組みを作ります。

今後の記事ではOAuth1.0/2.0 の違いや OIDC との関係を整理します!

背景 🖼️

こちらの本でOAuthについて説明されていました。
また、業務でGoogle、Microsoftを使ったログインをしているのでそれとも関係しているのかなと思いました。
改めて概要を理解したいと思います

認可とは 💡

リソースにアクセスする為の認可を得る

何ができるか(リソースを利用すること)を許可する仕組みのこと

OAuthとは 💡

リソースを持つサービスAがそのリソースを利用したいサービスBにそのリソースを利用することを許可する仕組みのこと

OAuthのイメージ図を以下に示します。

image.png

  1. サービスBがサービスAに登録しているユーザーMの情報を使用したいとリクエストをします
  2. サービスBがサービスAのユーザーMの情報を利用することの許可をユーザーMに求めます
  3. ユーザーMが許可します
  4. サービスAに登録しているユーザーMの情報にアクセスする為のトークンをサービスBへレスポンスに乗せて提供します

image.png

サービスBはこのトークン(アクセストークン)を使うことでサービスAにあるユーザーMの情報を利用できるようになります。

OAuthの実例 🕵️‍♀️

FindyをQiitaでログインする
image.png

Qiitaの認可画面

  • FindyがQiitaに登録してあるユーザー情報を利用することの許可するか確認しています

image.png

これはまさに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からデータを取得する概要 🖼️

image.png

Google OAuthはOAuth2.0を採用しています。

保護対象リソース;リソースを持つサーバー、トークンを受け取るとリソースへアクセスできるようにする

認可サーバー;クライアントアプリのリソースサーバーへのアクセスの認可、トークン発行を担当する

クライアント:保護対象リソースによって提供されるAPIを利用するソフトウェア全てのこと

The authorization server may be the same server as the resource server or a separate entity
認可サーバーはリソースサーバーと同じサーバー上にあってもよいし、別々のサーバーとして分離されていてもよい。

先ほどの概念図に語句を追加すると以下のようになります。

image.png

イメージが掴めたところで次にGoogle Calendar API,Google OAuthの同意画面の設定をします。

Google Calendar APIの有効化の設定 ⚙️

以下画像の順で設定しました。

image.png

image.png

image.png

b.png

image.png

image.png

image.png

image.png

image.png

OAuth同意画面の設定 ⚙️

以下画像の順で設定しました。

image.png

image.png

60b66c9f-7bc6-4f77-817d-5f73c99811a2.png

image.png

今回はテストユーザーでGoogle OAuthを使用します。
「+ Add users」を押してログインしたいメールアドレスを登録してください。
Googleの一部スコープ(例:Gmail API, カレンダーAPI)は、公開前はテストユーザーしか使えないです。

公開前のクライアントアプリからoauthログインをしようとすると以下のように表示されます。

image.png

Goでクライアントアプリを実装する 🏃‍♀️

こちらで実装しました。

Google OAuthの認可画面にアクセスする 👍

localhost:8000/auth

beb2a81e-e9c8-4c2f-bf39-4589a74af6e7.png

image.png

fd596a6d-6b55-41fc-89af-33a4ff2b3756.png

https://www.googleapis.com/calendar/v3/users/me/calendarListのGETリクエストで取得したjsonが返されます。

image.png

最後に

  • OAuthの概要が掴めました
  • 次回は以下を整理したいです
    • OAuth2.0とOAuthの違い
    • OIDCについて、OAuthは認可のみの認識だが認証もしていることについて

この本をしっかり読み込んでみたいと思います。

長い記事になってしまいましたがここまで読んで頂きありがとうございました。

参考 📚

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?