2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OAuth2.0 を理解したい

2
Last updated at Posted at 2025-11-16

OAuth2.0とは?

OAuth2.0(オーオース2.0)とは、ユーザの同意に基づいて、
異なるアプリケーション間で安全にユーザ情報の共有するための「認可プロトコル」です。

OAuth2.0には、5つのフローがありますが、
今回は、Webアプリケーションで使用される「認可コードフロー(Authorization Code Grant)」に限定して紹介します。

▪️登場人物

  1. ユーザ
    サービス利用者。
    例えばGoogleアカウントを持っている人
  2. クライアントアプリ
    他のサービスにリソースを要求するアプリ。
    例えば「Googleでログイン」を使うアプリ
  3. 認可サーバ
    クライアントアプリのリクエストを検証し、アクセストークンを発行するサーバ。
    例えばGoogle API
  4. リソースサーバ
    ユーザのデータ(リソース)があるサーバ。
    これもGoogle APIなどが該当します

▪️ 全体の流れ

image.png

① ユーザが「Googleでログイン」ボタンをクリック
② クライアントアプリが認可コードを要求
③ 認可サーバがユーザに、クライアントアプリのアクセス許可を確認
④ ユーザがアクセスを許可
⑤ 認可サーバが認可コードを発行
⑥ クライアントアプリがアクセストークンを要求
⑦ 認可サーバがアクセストークンを発行
⑧ クライアントアプリがリソースを要求
⑨ リソースサーバがユーザのデータを送信

▪️各ステップのパラメータ

②クライアントアプリが認可コードを要求

パラメータ 説明 必須/任意
client_id OAuthクライアントID 必須
redirect_uri 認可コード取得後にリダイレクトされるURL 必須
response_type code 固定(認可コードフローであることを指定) 必須
scope アクセスしたい情報(openid / email / profile など) 任意
state CSRF 対策ランダム文字列(推奨) 任意
POST {認可サーバ}
const params = {
    client_id: process.env.GOOGLE_CLIENT_ID,
    client_secret: process.env.GOOGLE_CLIENT_SECRET,
    code,
    redirect_uri: "http://localhost:3000/callback",
    grant_type: "authorization_code",
};

⑤ 認可サーバが認可コードを発行

http://localhost:3000/callback?code=xxxx&state=yyyy

// redirect_uri = http://localhost:3000/callback
// code : 認可コード
// state :リクエスト時のものと照合する

⑥ クライアントアプリがアクセストークンを要求

パラメータ 説明 必須/任意
client_id OAuthクライアントID 必須
client_secret クライアントシークレット 必須
code 認可コード 必須
redirect_uri アクセストークン取得後にリダイレクトされる URL 必須
grant_type OAuth2.0 フローの種類
認可コードフローは
"authorization_code" 固定
必須
POST {認可サーバ}
const params = {
    client_id: process.env.GOOGLE_CLIENT_ID,
    client_secret: process.env.GOOGLE_CLIENT_SECRET,
    code,
    redirect_uri: "http://localhost:3000/callback",
    grant_type: "authorization_code",
};

⑦ 認可サーバがアクセストークンを発行

パラメータ 説明
access_token Google API を呼ぶときに
Authorization: Bearer <token> として使用
expires_in アクセストークンの有効期限(秒)
scope アクセス可能なスコープ
token_type "Bearer" 固定
refresh_token スコープを要求した場合のみ取得可能
const tokens = {
  "access_token": "ya29.a0AfH6SMAxxxxxx",
  "expires_in": 3599,
  "scope": "openid email profile",
  "token_type": "Bearer",
  "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ij..."
}

▪️ 認可コードの検証の流れ

  1. 認可コードの存在確認
    リクエストで送られてきた認可コードが、
    サーバの「発行済みコードリスト」に存在するかを確認します。

  2. クライアント情報の確認
    リクエストのclient_id(または認証済みクライアント)とコードの紐付けを照合します。

  3. リダイレクトURIの確認
    認可コード発行時に指定されたredirect_uriと、
    アクセストークンリクエストのredirect_uriが一致するか確認します。

  4. コードの有効期限確認
    認可コードは短時間しか有効ではありません(通常数分)。
    有効期限切れの場合は拒否します。

  5. コードの一度きり使用確認
    認可コードは一度だけ使えます。
    既に使われたコードなら拒否します。

▪️ アクセストークン検証の流れ

  1. JWT検証を行う
    アクセストークンはJWTであるため、標準のJWT検証を実行します。
    詳細は JWTとは何かをご参照ください。

  2. scopeの確認
    JWTのペイロードにあるscopeを確認します。
    アクセスするエンドポイントで求められる権限と一致している必要があります。

まとめ

OAuth2.0の認可コードフロー(Authorization Code Grant)について
自分の理解をまとめてみました。

OAuth2.0とは、

  • 異なるアプリケーション間で安全にユーザ情報の共有するための「認可プロトコル」
  • ユーザ情報を使用するための許可証として、アクセストークンをやり取りする
  • 成りすましなどを防ぐため、アクセストークンの発行手続きに認可コードを使用する
  • クライアントアプリは、認可コードを送りアクセストークン発行を要求する

image.png

参考文献

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?