ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
OAuth 2.0 とは何か
OAuth 2.0 は RFC 6749 で定義された認可(Authorization)プロトコルです。誤解されがちですが、認可の仕組みであって、認証(誰なのか)は OpenID Connect が担当します。
典型例: 「このアプリに Google アカウントの連絡先を読ませて良いか?」というユーザー同意を得て、Google から連絡先 API へのアクセス権(access_token)を発行してもらいます。アプリは Google パスワードを知ることなく、必要な権限だけを得られます。
登場人物(4 つのロール)
| ロール | 例 | 役割 |
|---|---|---|
| Resource Owner | ユーザー | データの持ち主、認可を与える |
| Client | サードパーティアプリ | API を呼びたいアプリ |
| Authorization Server | Google / GitHub の OAuth サーバー | access_token を発行 |
| Resource Server | Google People API 等 | access_token を検証してデータを返す |
Authorization Code Flow(標準・最もよく使う)
サーバーサイドアプリ向けの標準フロー。ブラウザ経由でリダイレクトしながら認可コードを取得し、サーバー側で access_token と交換します。
[1] ユーザー → クライアントの「Google でログイン」ボタンをクリック
[2] クライアント → ブラウザを Google の認可エンドポイントへリダイレクト
GET https://accounts.google.com/o/oauth2/v2/auth?
response_type=code
&client_id=xxx
&redirect_uri=https://app.example.com/callback
&scope=email%20profile
&state=randomstring ← CSRF 対策
[3] Google → ユーザー: ログイン + 同意画面
[4] Google → クライアントの redirect_uri に code を返す
GET https://app.example.com/callback?code=AUTH_CODE&state=randomstring
[5] クライアント (サーバー側) → Google のトークンエンドポイントに POST
POST https://oauth2.googleapis.com/token
{
"grant_type": "authorization_code",
"code": "AUTH_CODE",
"client_id": "xxx",
"client_secret": "yyy",
"redirect_uri": "https://app.example.com/callback"
}
[6] Google → access_token + refresh_token + id_token を返す
[7] クライアント → access_token で API を呼ぶ
GET https://www.googleapis.com/oauth2/v3/userinfo
Authorization: Bearer ACCESS_TOKEN
PKCE(Proof Key for Code Exchange)
SPA / モバイルアプリは client_secret を安全に保管できないため、Authorization Code Flow に PKCE 拡張(RFC 7636)を組み合わせます。現在は全クライアントで PKCE 推奨。
// 1. code_verifier を生成(ランダム 43-128 文字)
const codeVerifier = base64UrlEncode(crypto.getRandomValues(new Uint8Array(32)));
// 2. code_challenge = SHA256(code_verifier) を生成
const codeChallenge = base64UrlEncode(
await crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier))
);
// 3. 認可リクエストに付与
const url = `https://accounts.google.com/o/oauth2/v2/auth?
response_type=code
&client_id=${CLIENT_ID}
&redirect_uri=${REDIRECT_URI}
&scope=email
&code_challenge=${codeChallenge}
&code_challenge_method=S256
&state=${state}`;
// 4. トークン交換時に code_verifier を送る
const tokenRes = await fetch('https://oauth2.googleapis.com/token', {
method: 'POST',
body: new URLSearchParams({
grant_type: 'authorization_code',
code: receivedCode,
client_id: CLIENT_ID,
redirect_uri: REDIRECT_URI,
code_verifier: codeVerifier, // ← サーバが SHA256 して code_challenge と比較
}),
});
主なグラントタイプ一覧
| Grant Type | 用途 | 推奨 |
|---|---|---|
| authorization_code | Web アプリ・SPA・モバイル(PKCE 併用) | 標準 |
| client_credentials | サーバー間通信(ユーザー不在) | マシン to マシン |
| refresh_token | access_token の再発行 | 長期セッション |
| password | ユーザー ID/PW を直接渡す | 非推奨(レガシ用途のみ) |
| implicit | SPA がトークンを直接受け取る | 非推奨(PKCE で代替) |
| device_code | TV / IoT 等のキー入力困難な機器 | RFC 8628 |
access_token と refresh_token
| 項目 | access_token | refresh_token |
|---|---|---|
| 用途 | API 呼び出し | access_token 再発行 |
| 寿命 | 短命(5 分〜 1 時間) | 長命(数日〜無期限) |
| 形式 | 多くは JWT / Bearer トークン | 不透明な文字列 |
| 送信先 | Resource Server | Authorization Server のみ |
| 漏洩リスク | 有効期限内のみ悪用可 | 長期悪用可 → 安全に保管必須 |
Laravel Passport(OAuth2 サーバ)
自前のアプリで OAuth2 サーバーを立てるなら Laravel Passport:
composer require laravel/passport
php artisan migrate
php artisan passport:install
# → Client ID / Secret が表示される// app/Models/User.php
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
// app/Providers/AuthServiceProvider.php
use Laravel\Passport\Passport;
public function boot(): void
{
Passport::routes();
Passport::tokensExpireIn(now()->addDays(15));
Passport::refreshTokensExpireIn(now()->addDays(30));
}
// config/auth.php
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Laravel Socialite(OAuth クライアント)
Google / GitHub / Twitter にログインさせる側(クライアント)として使うのが Socialite:
composer require laravel/socialite// config/services.php
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => env('GITHUB_REDIRECT'),
],
// ルーティング
use Laravel\Socialite\Facades\Socialite;
Route::get('/auth/github', fn() => Socialite::driver('github')->redirect());
Route::get('/auth/github/callback', function () {
$github = Socialite::driver('github')->user();
$user = User::updateOrCreate(
['email' => $github->getEmail()],
[
'name' => $github->getName(),
'github_id' => $github->getId(),
'github_token' => $github->token,
'github_refresh' => $github->refreshToken,
]
);
Auth::login($user);
return redirect('/dashboard');
});
OAuth 2.0 と OpenID Connect の違い
| 項目 | OAuth 2.0 | OpenID Connect |
|---|---|---|
| 目的 | 認可(権限委譲) | 認証(誰なのか) |
| 発行されるもの | access_token | access_token + id_token (JWT) |
| 標準クレーム | なし | sub / email / name 等が JWT に含まれる |
| 関係 | — | OAuth 2.0 の上に乗る拡張 |
セキュリティ注意点
- state パラメータで CSRF 対策: 認可リクエストで送り、コールバックで照合
- redirect_uri は完全一致: クライアント登録時の URI と一致しないとサーバが拒否
- client_secret はサーバー側のみ: フロントエンドに埋めない(PKCE で代替)
- access_token は HTTPS でのみ送信
- JWT 検証: 署名 / iss / aud / exp を必ずチェック
FAQ
Q: OAuth 1.0 との違いは?
A: 1.0 は署名計算が複雑で実装ミスが多発、2.0 は HTTPS 前提で大幅に簡略化。現在は 1.0 はほぼ使われません。
Q: Implicit Flow を使ってはいけない?
A: 2020 年の OAuth 2.0 Security BCP で非推奨に。SPA は Authorization Code + PKCE を使ってください。
Q: refresh_token を使わずに済ませる方法は?
A: access_token の寿命を長くする方法もありますが、漏洩リスクが上がるため非推奨。短命 access + refresh の組合せが標準です。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
同階層のページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?