Firebase: Permission denied
Firebaseでセキュリティルールによりアクセスが拒否された場合の解決策
概要
FirebaseのセキュリティルールによりFirestoreやRealtimeDBへのアクセスが拒否されるエラーです。
エラーメッセージ
``` FirebaseError: Missing or insufficient permissions. ```
原因
- セキュリティルールが厳しい: 認証なしでアクセス
- ルールの条件不一致: ドキュメントパスが違う
- 認証トークンの期限切れ: ログインが必要
- ルールのデプロイ忘れ: ローカルと本番の差異
解決策
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の場合を考慮しない
- ルールをデプロイせずにテスト
関連エラー
関連エラー
この記事は役に立ちましたか?