MeWrite Docs

OAuth2: access_denied

OAuth2認証でアクセスが拒否された際のエラー原因と解決策

概要

OAuth2フローでユーザーまたはサーバーがアクセスを拒否した際に発生するエラーです。

エラーメッセージ

{
  "error": "access_denied",
  "error_description": "The resource owner or authorization server denied the request"
}

原因

  1. ユーザーが同意を拒否: 認可画面でキャンセル
  2. スコープの権限不足: 要求したスコープが許可されていない
  3. クライアントIDの不正: 登録されていないクライアント
  4. リダイレクトURIの不一致: 登録URIと異なる

解決策

1. スコープを確認

1
2
3
4
5
6
// 必要最小限のスコープを要求
const authUrl = `https://accounts.google.com/o/oauth2/v2/auth?
  client_id=${CLIENT_ID}&
  redirect_uri=${REDIRECT_URI}&
  scope=openid email profile&
  response_type=code`;

2. リダイレクトURIを登録

# OAuth プロバイダーの管理画面で登録
許可されたリダイレクトURI:
- http://localhost:3000/callback (開発)
- https://example.com/callback (本番)

3. エラーハンドリング

1
2
3
4
5
6
7
8
9
app.get('/callback', (req, res) => {
  if (req.query.error === 'access_denied') {
    // ユーザーが拒否した場合の処理
    return res.redirect('/login?error=cancelled');
  }

  const code = req.query.code;
  // トークン取得処理...
});

4. クライアント設定を確認

1
2
3
4
5
6
// 正しいクライアントID/シークレット
const oauth2Client = new OAuth2Client(
  process.env.GOOGLE_CLIENT_ID,
  process.env.GOOGLE_CLIENT_SECRET,
  process.env.REDIRECT_URI
);

よくある間違い

  • 本番と開発でクライアントIDを混同
  • リダイレクトURIの末尾スラッシュ
  • 過剰なスコープ要求でユーザーが警戒
  • PKCEを使用していない(OAuth 2.1では必須)

セキュリティベストプラクティス

OAuth 2.1ではPKCE(Proof Key for Code Exchange)が必須です。invalid_grantエラーの防止にも有効です。

1
2
3
4
5
6
7
8
// PKCEを使用した認可リクエスト
const authUrl = `https://accounts.google.com/o/oauth2/v2/auth?
  client_id=${CLIENT_ID}&
  redirect_uri=${REDIRECT_URI}&
  scope=openid email profile&
  response_type=code&
  code_challenge=${codeChallenge}&
  code_challenge_method=S256`;

参考リンク

関連エラー

関連エラー

Security の他のエラー

最終更新: 2025-12-10