OAuth2.0とは?
OAuth2.0(オーオース2.0)とは、ユーザの同意に基づいて、
異なるアプリケーション間で安全にユーザ情報の共有するための「認可プロトコル」です。
OAuth2.0には、5つのフローがありますが、
今回は、Webアプリケーションで使用される「認可コードフロー(Authorization Code Grant)」に限定して紹介します。
▪️登場人物
- ユーザ
サービス利用者。
例えばGoogleアカウントを持っている人 - クライアントアプリ
他のサービスにリソースを要求するアプリ。
例えば「Googleでログイン」を使うアプリ - 認可サーバ
クライアントアプリのリクエストを検証し、アクセストークンを発行するサーバ。
例えばGoogle API - リソースサーバ
ユーザのデータ(リソース)があるサーバ。
これもGoogle APIなどが該当します
▪️ 全体の流れ
① ユーザが「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..."
}
▪️ 認可コードの検証の流れ
- 認可コードの存在確認
リクエストで送られてきた認可コードが、
サーバの「発行済みコードリスト」に存在するかを確認します。
- クライアント情報の確認
リクエストのclient_id(または認証済みクライアント)とコードの紐付けを照合します。
- リダイレクトURIの確認
認可コード発行時に指定されたredirect_uriと、
アクセストークンリクエストのredirect_uriが一致するか確認します。
- コードの有効期限確認
認可コードは短時間しか有効ではありません(通常数分)。
有効期限切れの場合は拒否します。
- コードの一度きり使用確認
認可コードは一度だけ使えます。
既に使われたコードなら拒否します。
▪️ アクセストークン検証の流れ
- JWT検証を行う
アクセストークンはJWTであるため、標準のJWT検証を実行します。
詳細は JWTとは何かをご参照ください。
- scopeの確認
JWTのペイロードにあるscopeを確認します。
アクセスするエンドポイントで求められる権限と一致している必要があります。
まとめ
OAuth2.0の認可コードフロー(Authorization Code Grant)について
自分の理解をまとめてみました。
OAuth2.0とは、
- 異なるアプリケーション間で安全にユーザ情報の共有するための「認可プロトコル」
- ユーザ情報を使用するための許可証として、アクセストークンをやり取りする
- 成りすましなどを防ぐため、アクセストークンの発行手続きに認可コードを使用する
- クライアントアプリは、認可コードを送りアクセストークン発行を要求する
参考文献

