MeWrite Docs

Firebase: Permission denied

Firebaseでセキュリティルールによりアクセスが拒否された場合の解決策

概要

FirebaseのセキュリティルールによりFirestoreやRealtimeDBへのアクセスが拒否されるエラーです。

エラーメッセージ

``` FirebaseError: Missing or insufficient permissions. ```

原因

  1. セキュリティルールが厳しい: 認証なしでアクセス
  2. ルールの条件不一致: ドキュメントパスが違う
  3. 認証トークンの期限切れ: ログインが必要
  4. ルールのデプロイ忘れ: ローカルと本番の差異

解決策

1. 基本的なFirestoreルール

```javascript // firestore.rules rules_version = ‘2’; service cloud.firestore { match /databases/{database}/documents { // ユーザー自身のデータのみ match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }

// 公開データ
match /posts/{postId} {
  allow read: if true;
  allow write: if request.auth != null;
}

} } ```

2. 認証状態を確認

```javascript import { getAuth, onAuthStateChanged } from ‘firebase/auth’;

const auth = getAuth(); onAuthStateChanged(auth, (user) => { if (user) { console.log(‘Logged in:’, user.uid); // Firestoreにアクセス } else { console.log(‘Not logged in’); } }); ```

3. ルールをテスト

```javascript // Firebase Emulator でテスト const { assertFails, assertSucceeds } = require(’@firebase/rules-unit-testing’);

it(‘allows users to read their own data’, async () => { const db = getFirestore({ uid: ‘user1’ }); await assertSucceeds(db.collection(‘users’).doc(‘user1’).get()); });

it(‘denies users to read others data’, async () => { const db = getFirestore({ uid: ‘user1’ }); await assertFails(db.collection(‘users’).doc(‘user2’).get()); }); ```

4. カスタムクレームを使用

```javascript // Admin SDK でカスタムクレームを設定 await admin.auth().setCustomUserClaims(uid, { admin: true });

// ルールで確認 match /admin/{document=**} { allow read, write: if request.auth.token.admin == true; } ```

よくある間違い

  • 開発中にallow read, write: if trueにして本番に出す
  • request.authがnullの場合を考慮しない
  • ルールをデプロイせずにテスト

関連エラー

関連エラー

最終更新: 2025-12-11