āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāϝāĻŧāĻŽ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ

Firebase āφāĻĒāύāĻžāϕ⧇ āφāĻĒāύāĻžāϰ Rules āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϏāϰāĻžā§āϜāĻžāĻŽ āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰ⧇, āĻĒā§āϰāϤāĻŋāϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻāĻŦāĻ‚ āĻĒā§āϰāĻ¤ā§āϝ⧇āĻ•āϟāĻŋ āĻāĻ•āχ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ Firebase āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāϝāĻŧāĻŽ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤

āĻāϟāĻŋ āϚāĻžāϞ⧁ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϕ⧋āύ āϟ⧁āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ āύāĻž āϕ⧇āύ, āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž API:

  • āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽā§‡āϰ āĻ‰ā§ŽāϏ āχāύāĻœā§‡āĻ¸ā§āϟ āĻ•āϰ⧇: āύāĻŋāϝāĻŧāĻŽā§‡āϰ āĻāĻ•āϟāĻŋ āϏ⧇āϟ, āϏāĻžāϧāĻžāϰāĻŖāϤ Firebase Security Rules āĻŦāĻŋāĻŦ⧃āϤāĻŋ āϧāĻžāϰāĻŖāĻ•āĻžāϰ⧀ āĻāĻ•āϟāĻŋ āϕ⧋āĻĄ āĻĢāĻžāχāϞāĨ¤
  • āĻāĻ•āϟāĻŋ āĻ…āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧀āϝāĻŧ āϰ⧁āϞāϏ⧇āϟ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāĻž āĻ‰ā§ŽāϏ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇āĨ¤
  • āĻāĻ•āϟāĻŋ āϰāĻŋāϞāĻŋāĻœā§‡ āĻĒā§āϰāϤāĻŋāϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āĻŸā§‡āϰ āĻ¸ā§āĻĨāĻžāĻĒāύāĻž āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰ⧇āĨ¤ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āĻŦāĻŋāϧāĻŋ-āϏāĻ•ā§āώāĻŽ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āĻāĻ•āϟāĻŋ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āϏāĻŽā§āĻĒāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āĻŽā§‚āĻ˛ā§āϝāĻžāϝāĻŧāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ āϰāĻŋāϞāĻŋāϜ āϏāĻ¨ā§āϧāĻžāύ āĻ•āϰ⧇āĨ¤
  • āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āĻŸā§‡āϰ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•āϟāĻŋāĻ• āĻāĻŦāĻ‚ āĻļāĻŦā§āĻĻāĻžāĻ°ā§āĻĨāĻŋāĻ• āĻĒāϰ⧀āĻ•ā§āώāĻž āϚāĻžāϞāĻžāύ⧋āϰ āĻ•ā§āώāĻŽāϤāĻž āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤

Firebase CLI āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

Firebase CLI-āĻāϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āφāĻĒāύāĻŋ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻ‰ā§ŽāϏāϗ⧁āϞāĻŋ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āϰāĻŋāϞāĻŋāϜāϗ⧁āϞāĻŋ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ⧎ CLI āĻāϰ Firebase Local Emulator Suite āφāĻĒāύāĻžāϕ⧇ āωāĻ¤ā§āϏāϗ⧁āϞāĻŋāϰ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧ⧎

CLI āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϕ⧋āĻĄ āϏāĻš āφāĻĒāύāĻžāϰ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋāϕ⧇ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāϪ⧇ āϰāĻžāĻ–āϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϰ āĻ…āĻ‚āĻļ āĻšāĻŋāϏāĻžāĻŦ⧇ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤

āĻāĻ•āϟāĻŋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

āφāĻĒāύāĻŋ āϝāĻ–āύ Firebase CLI āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧇āύ, āϤāĻ–āύ āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ .rules āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āύāĨ¤ āφāĻĒāύāĻžāϰ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ:

Cloud Firestore

// Set up Firestore in your project directory, creates a .rules file
firebase init firestore

Realtime Database

// Set up Realtime Database in your project directory, creates a .rules file
firebase init database

Cloud Storage

// Set up Storage in your project directory, creates a .rules file
firebase init storage

āφāĻĒāύāĻžāϰ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāĻŦāĻ‚ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧁āύ

.rules āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻĢāĻžāχāϞ⧇ āϏāϰāĻžāϏāϰāĻŋ āφāĻĒāύāĻžāϰ āύāĻŋāϝāĻŧāĻŽā§‡āϰ āĻ‰ā§ŽāϏ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰ⧁āύāĨ¤

Firebase CLI-āϤ⧇ āφāĻĒāύāĻžāϰ āĻ•āϰāĻž āϝ⧇āϕ⧋āύ⧋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž Firebase āĻ•āύāϏ⧋āϞ⧇ āĻĒā§āϰāϤāĻŋāĻĢāϞāĻŋāϤ āĻšāϝāĻŧ⧇āϛ⧇ āĻŦāĻž āφāĻĒāύāĻŋ Firebase āĻ•āύāϏ⧋āϞ āĻŦāĻž Firebase CLI āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāϛ⧇āύ āĻ•āĻŋāύāĻž āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύāĨ¤ āĻ…āĻ¨ā§āϝāĻĨāĻžāϝāĻŧ, āφāĻĒāύāĻŋ Firebase āĻ•āύāϏ⧋āϞ⧇ āĻ•āϰāĻž āϝ⧇āϕ⧋āύ⧋ āφāĻĒāĻĄā§‡āϟ āĻ“āĻ­āĻžāϰāϰāĻžāχāϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āφāĻĒāύāĻžāϰ āφāĻĒāĻĄā§‡āϟ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύ

Local Emulator Suite āϏāĻŽāĻ¸ā§āϤ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāϝāĻŧāĻŽ-āϏāĻ•ā§āώāĻŽ āĻĒāĻŖā§āϝ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻŽā§āϞ⧇āϟāϰ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻāĻŽā§āϞ⧇āϟāϰ⧇āϰ āϜāĻ¨ā§āϝ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āĻŦāĻŋāϧāĻŋ āχāĻžā§āϜāĻŋāύ āύāĻŋāϝāĻŧāĻŽā§‡āϰ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•āϟāĻŋāĻ• āĻāĻŦāĻ‚ āĻļāĻŦā§āĻĻāĻžāĻ°ā§āĻĨāĻŋāĻ• āĻŽā§‚āĻ˛ā§āϝāĻžāϝāĻŧāύ āωāĻ­āϝāĻŧāχ āĻ•āϰ⧇, āĻāχāĻ­āĻžāĻŦ⧇ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āĻŦāĻŋāϧāĻŋ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž API āĻ…āĻĢāĻžāϰ āĻ•āϰ⧇ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•āϟāĻŋāĻ• āĻĒāϰ⧀āĻ•ā§āώāĻžāϕ⧇ āĻ…āϤāĻŋāĻ•ā§āϰāĻŽ āĻ•āϰ⧇āĨ¤

āφāĻĒāύāĻŋ āϝāĻĻāĻŋ CLI-āĻāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āύ, Firebase Security Rules āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϜāĻ¨ā§āϝ āĻ¸ā§āϝ⧁āϟ āĻāĻ•āϟāĻŋ āϚāĻŽā§ŽāĻ•āĻžāϰ āϟ⧁āϞāĨ¤ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧāĻ­āĻžāĻŦ⧇ āφāĻĒāύāĻžāϰ āφāĻĒāĻĄā§‡āϟāϗ⧁āϞāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ Local Emulator Suite āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύ āϝ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ Rules āφāĻĒāύāĻŋ āϝ⧇ āφāϚāϰāĻŖāϟāĻŋ āϚāĻžāύ āϤāĻž āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰ⧇⧎

āφāĻĒāύāĻžāϰ āφāĻĒāĻĄā§‡āϟ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ

āĻāĻ•āĻŦāĻžāϰ āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ Rules āφāĻĒāĻĄā§‡āϟ āĻāĻŦāĻ‚ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āωāĻ¤ā§āϏāϗ⧁āϞāĻŋāϕ⧇ āωāĻ¤ā§āĻĒāĻžāĻĻāύ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ⧎

Cloud Firestore Security Rules āϜāĻ¨ā§āϝ, āφāĻĒāύāĻžāϰ firebase.json āĻĢāĻžāχāϞ āĻĒāĻ°ā§āϝāĻžāϞ⧋āϚāύāĻž āĻ“ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧇ āφāĻĒāύāĻžāϰ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻāĻŦāĻ‚ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āύāĻžāĻŽāĻ•ā§ƒāϤ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇ .rules āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϕ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ⧎

āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ⧀āĻ­āĻžāĻŦ⧇ āφāĻĒāύāĻžāϰ Rules āĻāĻ•āĻž āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻŦāĻž āφāĻĒāύāĻžāϰ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϰ āĻ…āĻ‚āĻļ āĻšāĻŋāϏāĻžāĻŦ⧇ āϏ⧇āϗ⧁āϞāĻŋ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ⧎

Cloud Firestore

// Deploy rules for all databases configured in your firebase.json
firebase deploy --only firestore:rules
// Deploy rules for the specified database configured in your firebase.json firebase deploy --only firestore:<databaseId>

Realtime Database

// Deploy your .rules file
firebase deploy --only database

Cloud Storage

// Deploy your .rules file
firebase deploy --only storage

Firebase āĻ•āύāϏ⧋āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āφāĻĒāύāĻŋ Rules āωāĻ¤ā§āϏāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŦāĻ‚ āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ Firebase āĻ•āύāϏ⧋āϞ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻ•āĻžāĻļ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ⧎ āφāĻĒāύāĻŋ Firebase āĻ•āύāϏ⧋āϞ UI āĻ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰāĻžāϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻĨ⧇ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•āϟāĻŋāĻ• āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ Rules āϖ⧇āϞāĻžāϰ āĻŽāĻžāĻ  āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻļāĻŦā§āĻĻāĻžāĻ°ā§āĻĨāĻŋāĻ• āĻĒāϰ⧀āĻ•ā§āώāĻž āωāĻĒāϞāĻŦā§āϧāĨ¤

āφāĻĒāύāĻžāϰ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāĻŦāĻ‚ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧁āύ

  1. Firebase āĻ•āύāϏ⧋āϞ āϖ⧁āϞ⧁āύ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ.
  2. āϤāĻžāϰāĻĒāϰ, āĻĒāĻŖā§āϝ āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻĨ⧇āϕ⧇ Realtime Database , Cloud Firestore āĻŦāĻž āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ Rules āϏāĻŽā§āĻĒāĻžāĻĻāϕ⧇ āύ⧇āĻ­āĻŋāϗ⧇āϟ āĻ•āϰāϤ⧇ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋāϤ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύ⧎
  3. āϏāϰāĻžāϏāϰāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāϕ⧇ āφāĻĒāύāĻžāϰ āύāĻŋāϝāĻŧāĻŽ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰ⧁āύāĨ¤

āφāĻĒāύāĻžāϰ āφāĻĒāĻĄā§‡āϟ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύ

āϏāĻŽā§āĻĒāĻžāĻĻāĻ• UI-āϤ⧇ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•ā§āϏ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ, āφāĻĒāύāĻŋ Rules āϖ⧇āϞāĻžāϰ āĻŽāĻžāĻ  āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāϰāĻžāϏāϰāĻŋ Firebase āĻ•āύāϏ⧋āϞ⧇ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻāĻŦāĻ‚ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āϰāĻŋāϏ⧋āĻ°ā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻļāĻŦā§āĻĻāĻžāĻ°ā§āĻĨāĻŋāĻ• Rules āφāϚāϰāĻŖ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ Rules āϏāĻŽā§āĻĒāĻžāĻĻāϕ⧇ āύāĻŋāϝāĻŧāĻŽ āϖ⧇āϞāĻžāϰ āĻŽāĻžāĻ  āĻ¸ā§āĻ•ā§āϰ⧀āύ āϖ⧁āϞ⧁āύ, āϏ⧇āϟāĻŋāĻ‚āϏ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϰāĻžāύ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤ āϏāĻŽā§āĻĒāĻžāĻĻāϕ⧇āϰ āĻļā§€āĻ°ā§āώ⧇ āύāĻŋāĻļā§āϚāĻŋāϤāĻ•āϰāĻŖ āĻŦāĻžāĻ°ā§āϤāĻžāϟāĻŋ āĻĻ⧇āϖ⧁āύāĨ¤

āφāĻĒāύāĻžāϰ āφāĻĒāĻĄā§‡āϟ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ

āĻāĻ•āĻŦāĻžāϰ āφāĻĒāύāĻŋ āϏāĻ¨ā§āϤ⧁āĻˇā§āϟ āĻšāύ āϝ⧇ āφāĻĒāύāĻžāϰ āφāĻĒāĻĄā§‡āϟāϗ⧁āϞāĻŋ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻž āĻ…āύ⧁āϝāĻžāϝāĻŧā§€, āĻĒā§āϰāĻ•āĻžāĻļ āĻ•āϰ⧁āύ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύ⧎

āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

āφāĻĒāύāĻŋ Node.js āϰ⧁āϞāϏ⧇āĻŸā§‡āϰ āϜāĻ¨ā§āϝ Admin SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻāχ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§āϝāĻžāϟāĻŋāĻ• āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇, āφāĻĒāύāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

  • āύāĻŋāϝāĻŧāĻŽ āĻĒāϰāĻŋāϚāĻžāϞāύāĻžāϰ āϜāĻ¨ā§āϝ āĻ•āĻžāĻ¸ā§āϟāĻŽ āϟ⧁āϞ, āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ, āĻĄā§āϝāĻžāĻļāĻŦā§‹āĻ°ā§āĻĄ āĻāĻŦāĻ‚ CI/CD āĻĒāĻžāχāĻĒāϞāĻžāχāύ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧁āύāĨ¤
  • āĻāĻ•āĻžāϧāĻŋāĻ• āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āϜ⧁āĻĄāĻŧ⧇ āφāϰāĻ“ āϏāĻšāĻœā§‡ āύāĻŋāϝāĻŧāĻŽ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύāĨ¤

āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāĻ—āϤāĻ­āĻžāĻŦ⧇ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāϪ⧇ āĻ…āύāĻŋāĻšā§āĻ›āĻžāĻ•ā§ƒāϤ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāϗ⧁āϞāĻŋ āĻāĻĄāĻŧāĻžāϤ⧇ āϖ⧁āĻŦāχ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āϪ⧎ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻžāϰ āĻ•āĻĨāĻž āĻŽāĻžāĻĨāĻžāϝāĻŧ āϰ⧇āϖ⧇ āφāĻĒāύāĻžāϰ Admin SDK āϕ⧋āĻĄ āϞāĻŋāϖ⧁āύ, āĻŦāĻŋāĻļ⧇āώ āĻ•āϰ⧇ āύāĻŋāϝāĻŧāĻŽ āφāĻĒāĻĄā§‡āϟ āĻŦāĻž āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧāĨ¤

āφāϰ⧇āĻ•āϟāĻŋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻŋāώāϝāĻŧ āĻŽāύ⧇ āϰāĻžāĻ–āϤ⧇ āĻšāĻŦ⧇ āϝ⧇ Firebase Security Rules āĻĒā§āϰāĻ•āĻžāĻļāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖāϰ⧂āĻĒ⧇ āĻĒā§āϰāϚāĻžāϰāĻŋāϤ āĻšāϤ⧇ āĻ•āϝāĻŧ⧇āĻ• āĻŽāĻŋāύāĻŋāϟ āϏāĻŽāϝāĻŧ āύ⧇āϝāĻŧāĨ¤ āύāĻŋāϝāĻŧāĻŽ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ Admin SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āϏ⧇āχ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇ āϝ⧇ āϰ⧇āϏ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋāϗ⧁āϞāĻŋ āĻāĻĄāĻŧāĻžāϤ⧇ āϭ⧁āϞāĻŦ⧇āύ āύāĻž āϝ⧇āϗ⧁āϞāĻŋāϰ āĻ¸ā§āĻĨāĻžāĻĒāύāĻž āĻāĻ–āύāĻ“ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāϝāĻŧāύāĻŋ⧎ āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāϪ⧇āϰ āύāĻŋāϝāĻŧāĻŽ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϘāύ āϘāύ āφāĻĒāĻĄā§‡āĻŸā§‡āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϝāĻŧ, Cloud Firestore āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻŽāĻžāϧāĻžāύāϗ⧁āϞāĻŋ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύ, āϝāĻž āϘāύ āϘāύ āφāĻĒāĻĄā§‡āϟ āĻšāĻ“āϝāĻŧāĻž āϏāĻ¤ā§āĻ¤ā§āĻŦ⧇āĻ“ āϰ⧇āϏ⧇āϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻ•āĻŽāĻžāϤ⧇ āĻĄāĻŋāϜāĻžāχāύ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻāχ āϏ⧀āĻŽāĻžāϗ⧁āϞāĻŋ āύ⧋āϟ āĻ•āϰ⧁āύ:

  • āĻ•ā§āϰāĻŽāĻŋāĻ• āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āĻ…āĻŦāĻļā§āϝāχ UTF-8 āĻāύāϕ⧋āĻĄ āĻ•āϰāĻž āĻĒāĻžāĻ ā§āϝ⧇āϰ 256 KiB-āĻāϰ āĻĨ⧇āϕ⧇ āϛ⧋āϟ āĻšāϤ⧇ āĻšāĻŦ⧇⧎
  • āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇ āϏāĻ°ā§āĻŦāĻžāϧāĻŋāĻ• 2500āϟāĻŋ āύāĻŋāϝāĻŧā§‹āϜāĻŋāϤ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāĻ•āĻŦāĻžāϰ āĻāχ āϏ⧀āĻŽāĻž āĻĒ⧌āρāϛ⧇ āϗ⧇āϞ⧇, āύāϤ⧁āύ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āφāϗ⧇ āφāĻĒāύāĻžāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻ•āĻŋāϛ⧁ āĻĒ⧁āϰāĻžāύ⧋ āύāĻŋāϝāĻŧāĻŽ āĻŽā§āϛ⧇ āĻĢ⧇āϞāϤ⧇ āĻšāĻŦ⧇⧎

Cloud Storage āĻŦāĻž Cloud Firestore āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ

Admin SDK āϏāĻžāĻĨ⧇ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āĻŦāĻŋāϧāĻŋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻ•āĻ°ā§āĻŽāĻĒā§āϰāĻŦāĻžāĻšā§‡ āϤāĻŋāύāϟāĻŋ āĻĒ⧃āĻĨāĻ• āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇:

  1. āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āĻĢāĻžāχāϞ āĻ‰ā§ŽāϏ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ (āϐāĻšā§āĻ›āĻŋāĻ•)
  2. āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ
  3. āϰāĻŋāϞāĻŋāϜ, āĻŦāĻž āĻ¸ā§āĻĨāĻžāĻĒāύ, āύāϤ⧁āύ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ

SDK Cloud Storage āĻāĻŦāĻ‚ Cloud Firestore āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāϝāĻŧāĻŽā§‡āϰ āϜāĻ¨ā§āϝ āĻāχ āϧāĻžāĻĒāϗ⧁āϞāĻŋāϕ⧇ āĻāĻ•āĻ• API āĻ•āϞ⧇ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰāĻžāϰ āĻāĻ•āϟāĻŋ āĻĒāĻĻā§āϧāϤāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ āϝ⧇āĻŽāύ:

    const source = `service cloud.firestore {
      match /databases/{database}/documents {
        match /carts/{cartID} {
          allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
          allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
        }
      }
    }`;
    // Alternatively, load rules from a file
    // const fs = require('fs');
    // const source = fs.readFileSync('path/to/firestore.rules', 'utf8');

    await admin.securityRules().releaseFirestoreRulesetFromSource(source);

āĻāχ āĻāĻ•āχ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ Cloud Storage āύāĻŋāϝāĻŧāĻŽā§‡āϰ āϜāĻ¨ā§āϝ releaseFirestoreRulesetFromSource() āĻāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤

āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĻ­āĻžāĻŦ⧇, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āχāύ-āĻŽā§‡āĻŽāϰāĻŋ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻšāĻŋāϏāĻžāĻŦ⧇ āύāĻŋāϝāĻŧāĻŽ āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŦāĻ‚ āĻāχ āχāϭ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋāϰ āϘāύāĻŋāĻˇā§āĻ  āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāϪ⧇āϰ āϜāĻ¨ā§āϝ āφāϞāĻžāĻĻāĻžāĻ­āĻžāĻŦ⧇ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āϝ⧇āĻŽāύ:

    const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
    const rs = await admin.securityRules().createRuleset(rf);
    await admin.securityRules().releaseFirestoreRuleset(rs);

Realtime Database āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧁āύ

Admin SDK āϏāĻžāĻĨ⧇ Realtime Database āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟāϗ⧁āϞāĻŋ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāϤ⧇, admin.database āĻāϰ getRules() āĻāĻŦāĻ‚ setRules() āĻĒāĻĻā§āϧāϤāĻŋāϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ⧎ āφāĻĒāύāĻŋ JSON āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇, āĻŦāĻž āĻŽāĻ¨ā§āϤāĻŦā§āϝ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻšāĻŋāϏāĻžāĻŦ⧇ āϰ⧁āϞāϏ⧇āϟ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāϤ⧇:

    const source = `{
      "rules": {
        "scores": {
          ".indexOn": "score",
          "$uid": {
            ".read": "$uid == auth.uid",
            ".write": "$uid == auth.uid"
          }
        }
      }
    }`;
    await admin.database().setRules(source);

āύāĻŋāϝāĻŧāĻŽāĻžāĻŦāϞ⧀ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ

āĻŦāĻĄāĻŧ āϰ⧁āϞāϏ⧇āϟāϗ⧁āϞāĻŋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, Admin SDK āφāĻĒāύāĻžāϕ⧇ admin.securityRules().listRulesetMetadata āĻāϰ āϏāĻžāĻĨ⧇ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āϏāĻŽāĻ¸ā§āϤ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āϤāĻžāϞāĻŋāĻ•āĻžāϭ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āϝ⧇āĻŽāύ:

    const allRulesets = [];
    let pageToken = null;
    while (true) {
      const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
      allRulesets.push(...result.rulesets);
      pageToken = result.nextPageToken;
      if (!pageToken) {
        break;
      }
    }

āϏāĻŽāϝāĻŧ⧇āϰ āϏāĻžāĻĨ⧇ 2500 āϰ⧁āϞāϏ⧇āϟ āϏ⧀āĻŽāĻžāϤ⧇ āĻĒ⧌āρāĻ›āĻžāύ⧋ āϖ⧁āĻŦ āĻŦāĻĄāĻŧ āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽāϝāĻŧ āϚāĻ•ā§āϰ⧇āϰ āĻĒā§āϰāĻžāĻšā§€āύāϤāĻŽ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āϜāĻ¨ā§āϝ āϝ⧁āĻ•ā§āϤāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, 30 āĻĻāĻŋāύ⧇āϰ āĻŦ⧇āĻļāĻŋ āϏāĻŽāϝāĻŧ āϧāϰ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āϏāĻŽāĻ¸ā§āϤ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āϜāĻ¨ā§āϝ:

    const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
    const promises = [];
    allRulesets.forEach((rs) => {
      if (new Date(rs.createTime) < thirtyDays) {
        promises.push(admin.securityRules().deleteRuleset(rs.name));
      }
    });
    await Promise.all(promises);
    console.log(`Deleted ${promises.length} rulesets.`);

REST API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

āωāĻĒāϰ⧇ āĻŦāĻ°ā§āĻŖāĻŋāϤ āϟ⧁āϞāϗ⧁āϞāĻŋ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻœā§‡āĻ•ā§āĻŸā§‡ āĻāĻ•āĻžāϧāĻŋāĻ• Cloud Firestore āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϜāĻ¨ā§āϝ Firebase Security Rules āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž āϏāĻš āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ•āĻ°ā§āĻŽāĻĒā§āϰāĻŦāĻžāĻšā§‡āϰ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧁āĻ•ā§āϤ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻĒāύāĻŋ āύāĻŋāĻœā§‡āχ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Firebase Security Rules āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āϚāĻžāχāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž API āφāĻĒāύāĻžāϕ⧇ āϏāĻ°ā§āĻŦāĻžāϧāĻŋāĻ• āύāĻŽāύ⧀āϝāĻŧāϤāĻž āĻĻ⧇āϝāĻŧāĨ¤

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻāχ āϏ⧀āĻŽāĻžāϗ⧁āϞāĻŋ āύ⧋āϟ āĻ•āϰ⧁āύ:

  • āĻ•ā§āϰāĻŽāĻŋāĻ• āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āĻ…āĻŦāĻļā§āϝāχ UTF-8 āĻāύāϕ⧋āĻĄ āĻ•āϰāĻž āĻĒāĻžāĻ ā§āϝ⧇āϰ 256 KiB-āĻāϰ āĻĨ⧇āϕ⧇ āϛ⧋āϟ āĻšāϤ⧇ āĻšāĻŦ⧇⧎
  • āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇ āϏāĻ°ā§āĻŦāĻžāϧāĻŋāĻ• 2500āϟāĻŋ āύāĻŋāϝāĻŧā§‹āϜāĻŋāϤ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāĻ•āĻŦāĻžāϰ āĻāχ āϏ⧀āĻŽāĻž āĻĒ⧌āρāϛ⧇ āϗ⧇āϞ⧇, āύāϤ⧁āύ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āφāϗ⧇ āφāĻĒāύāĻžāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻ•āĻŋāϛ⧁ āĻĒ⧁āϰāĻžāύ⧋ āύāĻŋāϝāĻŧāĻŽ āĻŽā§āϛ⧇ āĻĢ⧇āϞāϤ⧇ āĻšāĻŦ⧇⧎

REST āĻāϰ āϏāĻžāĻĨ⧇ Cloud Firestore āĻŦāĻž Cloud Storage āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ

āĻāχ āĻŦāĻŋāĻ­āĻžāϗ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖāϗ⧁āϞāĻŋ Firestore Rules āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āϝāĻĻāĻŋāĻ“ āϏ⧇āϗ⧁āϞāĻŋ Cloud Storage Rules āĻĒā§āϰāϝ⧋āĻœā§āϝ⧎

āωāĻĻāĻžāĻšāϰāĻŖāϗ⧁āϞāĻŋ āĻāĻĒāĻŋāφāχ āĻ•āϞ āĻ•āϰāϤ⧇ āĻ•āĻžāĻ°ā§āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻŸā§‹āϕ⧇āύ āϏ⧇āϟ āφāĻĒ āĻāĻŦāĻ‚ āĻĒāĻžāϏ āĻ•āϰāĻžāϰ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϗ⧁āϞāĻŋ āĻŦāĻžāĻĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇⧎ āφāĻĒāύāĻŋ āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ⧇āϰ āϏāĻžāĻĨ⧇ āχāĻ¨ā§āϟāĻŋāĻ—ā§āϰ⧇āĻŸā§‡āĻĄ API āĻāĻ•ā§āϏāĻĒā§āϞ⧋āϰāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāχ API āύāĻŋāϝāĻŧ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ āĻāĻĒāĻŋāφāχ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āϤ⧈āϰāĻŋ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāύ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻžāϧāĻžāϰāĻŖ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϗ⧁āϞāĻŋ āĻšāϞ:

  1. āύāĻŋāϝāĻŧāĻŽ āĻĢāĻžāχāϞ āωāĻ¤ā§āϏ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ
  2. āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ
  3. āύāϤ⧁āύ āϰ⧁āϞāϏ⧇āϟ āϰāĻŋāϞāĻŋāϜ (āĻĄāĻŋāĻĒā§āϞāϝāĻŧ) āĻ•āϰ⧁āύāĨ¤

āĻāĻ•āϟāĻŋ āĻ‰ā§ŽāϏ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

āϧāϰ⧁āύ āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ secure_commerce Firebase āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇ āĻ•āĻžāϜ āĻ•āϰāϛ⧇āύ āĻāĻŦāĻ‚ east_store āύāĻžāĻŽā§‡āϰ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻāĻ•āϟāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āϞāĻ•-āĻĄāĻžāωāύ Cloud Firestore Rules āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āϚāĻžāύāĨ¤

āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ firestore.rules āĻĢāĻžāχāϞ⧇ āĻāχ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

āĻāĻ–āύ, āĻāχ āĻĢāĻžāχāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ base64-āĻāύāϕ⧋āĻĄā§‡āĻĄ āĻĢāĻŋāĻ™ā§āĻ—āĻžāϰāĻĒā§āϰāĻŋāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύāĨ¤ āϤāĻžāϰāĻĒāϰ āφāĻĒāύāĻŋ projects.rulesets.create REST āĻ•āϞ āĻĻāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻĒ⧇āϞ⧋āĻĄāϟāĻŋ āĻĒā§‚āϰāĻŖ āĻ•āϰāϤ⧇ āĻāχ āĻĢāĻžāχāϞ⧇āϰ āωāĻ¤ā§āϏāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻāĻ–āĻžāύ⧇, REST āĻĒ⧇āϞ⧋āĻĄā§‡ firestore.rules āĻāϰ āĻŦāĻŋāώāϝāĻŧāĻŦāĻ¸ā§āϤ⧁ āϏāĻ¨ā§āύāĻŋāĻŦ⧇āĻļ āĻ•āϰāϤ⧇ cat āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ, āĻāϟāĻŋāϕ⧇ āφāĻĒāύāĻžāϰ east_store āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇, attachment_point east_store āĻ āϏ⧇āϟ āĻ•āϰ⧁āύāĨ¤

curl -X POST -d '{
  "source": {
    "files": [
      {
        "content": "' $(cat storage.rules) '",
        "name": "firestore.rules",
        "fingerprint": <sha fingerprint>
      },
    "attachment_point": "firestore.googleapis.com/databases/east_store"
    ]
  }
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'

API āĻāĻ•āϟāĻŋ āĻŦ⧈āϧāϤāĻž āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āĻŸā§‡āϰ āύāĻžāĻŽ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ projects/secure_commerce/rulesets/uuid123 āĨ¤

āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āϰāĻŋāϞāĻŋāϜ (āĻ¸ā§āĻĨāĻžāĻĒāύ)

āϝāĻĻāĻŋ āϰ⧁āϞāϏ⧇āϟāϟāĻŋ āĻŦ⧈āϧ āĻšāϝāĻŧ, āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ āĻšāϞ āĻāĻ•āϟāĻŋ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āϰāĻŋāϞāĻŋāĻœā§‡ āύāϤ⧁āύ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻžāĨ¤

curl -X POST -d '{
  "name": "projects/secure_commerce/releases/cloud.firestore/east_store"  ,
  "rulesetName": "projects/secure_commerce/rulesets/uuid123"
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'

āϏāĻšā§‡āϤāύ āĻĨāĻžāϕ⧁āύ āϝ⧇ Firebase Security Rules āĻĒā§āϰāĻ•āĻžāĻļāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖāϰ⧂āĻĒ⧇ āĻĒā§āϰāϚāĻžāϰāĻŋāϤ āĻšāϤ⧇ āĻ•āϝāĻŧ⧇āĻ• āĻŽāĻŋāύāĻŋāϟ āϏāĻŽāϝāĻŧ āύ⧇āϝāĻŧ⧎ āĻĒāϰāĻŋāϚāĻžāϞāύāĻžāϰ āϜāĻ¨ā§āϝ REST API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āϰ⧇āϏ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻāĻĄāĻŧāĻžāϤ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύ āϝ⧇āĻ–āĻžāύ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āϏ⧇āχ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇ āϝāĻžāϰ āĻ¸ā§āĻĨāĻžāĻĒāύāĻž āĻāĻ–āύāĻ“ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāϝāĻŧāύāĻŋ⧎

REST āĻāϰ āϏāĻžāĻĨ⧇ Realtime Database āϰ⧁āϞāϏ⧇āϟ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧁āύ

Realtime Database Rules āĻĒāϰāĻŋāϚāĻžāϞāύāĻžāϰ āϜāĻ¨ā§āϝ āύāĻŋāϜāĻ¸ā§āĻŦ REST āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ REST āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ Realtime Database Rules āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻĻ⧇āϖ⧁āύāĨ¤

REST āĻāϰ āϏāĻžāĻĨ⧇ āύāĻŋāϝāĻŧāĻŽāĻžāĻŦāϞ⧀ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ

āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āĻāĻŦāĻ‚ āϰāĻŋāϞāĻŋāϜ āϤ⧈āϰāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ REST āĻĒāĻĻā§āϧāϤāĻŋ āĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻŦ⧃āĻšā§Ž āύāĻŋāϝāĻŧāĻŽ āĻ¸ā§āĻĨāĻžāĻĒāύāĻž āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž API āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĒāĻĻā§āϧāϤāĻŋāϗ⧁āϞāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇:

  • āϤāĻžāϞāĻŋāĻ•āĻž, āĻĒ⧇āϤ⧇, āĻāĻŦāĻ‚ āĻŽā§āϛ⧇ āĻĢ⧇āϞ⧁āύ
  • āϤāĻžāϞāĻŋāĻ•āĻž, āĻĒ⧇āϤ⧇, āĻāĻŦāĻ‚ āύāĻŋāϝāĻŧāĻŽ āϰāĻŋāϞāĻŋāϜ āĻŽā§āϛ⧇ āĻĢ⧇āϞ⧁āύ

āϏāĻŽāϝāĻŧ⧇āϰ āϏāĻžāĻĨ⧇ 2500 āϰ⧁āϞāϏ⧇āϟ āϏ⧀āĻŽāĻžāϤ⧇ āĻĒ⧌āρāĻ›āĻžāύ⧋ āϖ⧁āĻŦ āĻŦāĻĄāĻŧ āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽāϝāĻŧ āϚāĻ•ā§āϰ⧇āϰ āĻĒā§āϰāĻžāĻšā§€āύāϤāĻŽ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āϜāĻ¨ā§āϝ āϝ⧁āĻ•ā§āϤāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, 30 āĻĻāĻŋāύ⧇āϰ āĻŦ⧇āĻļāĻŋ āϏāĻŽāϝāĻŧ āϧāϰ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āϏāĻŽāĻ¸ā§āϤ āύāĻŋāϝāĻŧāĻŽ āϏ⧇āϟ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻĒāύāĻŋ projects.rulesets.list āĻĒāĻĻā§āϧāϤāĻŋāϤ⧇ āĻ•āϞ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āϤāĻžāĻĻ⧇āϰ createTime āϕ⧀āϗ⧁āϞāĻŋāϤ⧇ Ruleset āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āϰ JSON āϤāĻžāϞāĻŋāĻ•āĻž āĻĒāĻžāĻ°ā§āϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āϤāĻžāϰāĻĒāϰ ruleset_id āĻĻā§āĻŦāĻžāϰāĻž āϏāĻ‚āĻļā§āϞāĻŋāĻˇā§āϟ āύāĻŋāϝāĻŧāĻŽāϏ⧇āϟāϗ⧁āϞāĻŋāϤ⧇ project.rulesets.delete āĻ•āϞ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

REST āĻĻāĻŋāϝāĻŧ⧇ āφāĻĒāύāĻžāϰ āφāĻĒāĻĄā§‡āϟ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύ

āĻ…āĻŦāĻļ⧇āώ⧇, āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ āĻāĻĒāĻŋāφāχ āφāĻĒāύāĻžāϕ⧇ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ āĻĒā§āϰ⧋āĻœā§‡āĻ•ā§āĻŸā§‡ Cloud Firestore āĻāĻŦāĻ‚ Cloud Storage āϰāĻŋāϏ⧋āĻ°ā§āϏ⧇ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•āϟāĻŋāĻ• āĻāĻŦāĻ‚ āϏāĻŋāĻŽā§‡āĻ¨ā§āϟāĻŋāĻ• āĻĒāϰ⧀āĻ•ā§āώāĻž āϚāĻžāϞāĻžāύ⧋āϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āϝāĻŧāĨ¤

āĻāĻĒāĻŋāφāχ-āĻāϰ āĻāχ āωāĻĒāĻžāĻĻāĻžāύāϟāĻŋāϰ āϏāĻžāĻĨ⧇ āĻŸā§‡āĻ¸ā§āϟāĻŋāĻ‚ āĻāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇:

  1. TestCase āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āϰ āĻāĻ•āϟāĻŋ āϏ⧇āϟ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāĻ¤ā§āĻŦ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ TestSuite JSON āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāĻž
  2. TestSuite āϜāĻŽāĻž āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāĻšā§āϛ⧇
  3. āĻĒāĻžāĻ°ā§āϏāĻŋāĻ‚ TestResult āĻŦāĻ¸ā§āϤ⧁ āĻĢ⧇āϰāϤ

āφāϏ⧁āύ testcase.json āĻĢāĻžāχāϞ⧇ āĻāĻ•āϟāĻŋ TestCase āϏāĻš āĻāĻ•āϟāĻŋ TestSuite āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāĻŋāĨ¤ āĻāχ āωāĻĻāĻžāĻšāϰāϪ⧇, āφāĻŽāϰāĻž āϏ⧇āχ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋāϤ⧇ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āĻ¸ā§āϝ⧁āĻŸā§‡āϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ REST āĻĒ⧇āϞ⧋āĻĄā§‡āϰ āϏāĻžāĻĨ⧇ Rules āĻ­āĻžāώāĻžāϰ āĻ‰ā§ŽāϏ āχāύāϞāĻžāχāύ⧇ āĻĒāĻžāϏ āĻ•āϰāĻŋāĨ¤ āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āύāĻŋāϝāĻŧāĻŽ āĻŽā§‚āĻ˛ā§āϝāĻžāϝāĻŧāύ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻž, āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡āϰ āĻ…āύ⧁āϰ⧋āϧ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰāĻŋ āϝāĻžāϰ āĻŦāĻŋāϰ⧁āĻĻā§āϧ⧇ āϰ⧁āϞāϏ⧇āϟ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤ āφāĻĒāύāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϰāĻŋāĻĒā§‹āĻ°ā§āϟāϟāĻŋ āĻ•āϤāϟāĻž āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϤāĻžāĻ“ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, "FULL" āĻŽāĻžāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĢāϞāĻžāĻĢāϞ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰāϤ⧇ āϏāĻŽāĻ¸ā§āϤ Rules āĻ­āĻžāώāĻžāϰ āĻ…āĻ­āĻŋāĻŦā§āϝāĻ•ā§āϤāĻŋ āĻĒā§āϰāϤāĻŋāĻŦ⧇āĻĻāύ⧇ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰāĻž āωāϚāĻŋāϤ, āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϏāĻžāĻĨ⧇ āĻŽā§‡āϞ⧇āύāĻŋ āĻāĻŽāύ āĻ…āĻ­āĻŋāĻŦā§āϝāĻ•ā§āϤāĻŋāϗ⧁āϞāĻŋ āϏāĻšāĨ¤

 {
  "source":
  {
    "files":
    [
      {
        "name": "firestore.rules",
        "content": "service cloud.firestore {
          match /databases/{database}/documents {
            match /users/{userId}{
              allow read: if (request.auth.uid == userId);
            }
            function doc(subpath) {
              return get(/databases/$(database)/documents/$(subpath)).data;
            }
            function isAccountOwner(accountId) {
              return request.auth.uid == accountId 
                  || doc(/users/$(request.auth.uid)).accountId == accountId;
            }
            match /licenses/{accountId} {
              allow read: if isAccountOwner(accountId);
            }
          }
        }"
      }
    ]
  },
  "testSuite":
  {
    "testCases":
    [
      {
        "expectation": "ALLOW",
        "request": {
           "auth": {"uid": "123"},
           "path": "/databases/(default)/documents/licenses/abcd",
           "method": "get"},
        "functionMocks": [
            {
            "function": "get",
            "args": [{"exact_value": "/databases/(default)/documents/users/123"}],
            "result": {"value": {"data": {"accountId": "abcd"}}}
            }
          ]
      }
    ]
  }
}

āϤāĻžāϰāĻĒāϰ āφāĻŽāϰāĻž projects.test āĻĒāĻĻā§āϧāϤāĻŋāϤ⧇ āĻŽā§‚āĻ˛ā§āϝāĻžāϝāĻŧāύ⧇āϰ āϜāĻ¨ā§āϝ āĻāχ TestSuite āϜāĻŽāĻž āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤

curl -X POST -d '{
    ' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'

āĻĢāĻŋāϰ⧇ āφāϏāĻž TestReport (āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϏāĻžāĻĢāĻ˛ā§āϝ/āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āĻ¸ā§āĻĨāĻŋāϤāĻŋ, āĻĄāĻŋāĻŦāĻžāĻ— āĻŦāĻžāĻ°ā§āϤāĻžāϗ⧁āϞāĻŋāϰ āϤāĻžāϞāĻŋāĻ•āĻž, āĻĒāϰāĻŋāĻĻāĻ°ā§āĻļāύ āĻ•āϰāĻž āύāĻŋāϝāĻŧāĻŽā§‡āϰ āĻ…āĻ­āĻŋāĻŦā§āϝāĻ•ā§āϤāĻŋāϰ āϤāĻžāϞāĻŋāĻ•āĻž āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āĻŽā§‚āĻ˛ā§āϝāĻžāϝāĻŧāύ āϰāĻŋāĻĒā§‹āĻ°ā§āϟ) āĻ¸ā§āĻĨāĻŋāϤāĻŋ āϏāĻžāĻĢāĻ˛ā§āϝ⧇āϰ āϏāĻžāĻĨ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻŦ⧇ āϝ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ…āύ⧁āĻŽā§‹āĻĻāĻŋāϤāĨ¤

āĻ•ā§āϰāϏ-āϏāĻžāĻ°ā§āĻ­āĻŋāϏ Cloud Storage Security Rules āϜāĻ¨ā§āϝ āĻ…āύ⧁āĻŽāϤāĻŋāϗ⧁āϞāĻŋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ

āφāĻĒāύāĻŋ āϝāĻĻāĻŋ Cloud Storage Security Rules āϤ⧈āϰāĻŋ āĻ•āϰ⧇āύ āϝāĻž āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻŽā§‚āĻ˛ā§āϝāĻžāϝāĻŧāύ āĻ•āϰāϤ⧇ Cloud Firestore āύāĻĨāĻŋāϰ āĻŦāĻŋāώāϝāĻŧāĻŦāĻ¸ā§āϤ⧁ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āϤāĻžāĻšāϞ⧇ āφāĻĒāύāĻžāϕ⧇ āĻĻ⧁āϟāĻŋ āĻĒāĻŖā§āϝ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āϏāĻ•ā§āώāĻŽ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ Firebase āĻ•āύāϏ⧋āϞ āĻŦāĻž Firebase CLI-āϤ⧇ āĻ…āύ⧁āϰ⧋āϧ āϜāĻžāύāĻžāύ⧋ āĻšāĻŦ⧇āĨ¤

āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāχ āϧāϰāύ⧇āϰ āĻ•ā§āϰāϏ-āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āĻ…āĻ•ā§āώāĻŽ āĻ•āϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύ⧇āύ:

  1. āĻĒā§āϰāĻĨāĻŽāϤ, āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϟāĻŋ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰāĻžāϰ āφāϗ⧇, Cloud Firestore āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ Rules āĻĢāĻžāĻ‚āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻŽāύ āϏāĻŽāĻ¸ā§āϤ āĻŦāĻŋāĻŦ⧃āϤāĻŋ āϏāϰāĻŋāϝāĻŧ⧇ āφāĻĒāύāĻžāϰ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰ⧁āύ⧎ āĻ…āĻ¨ā§āϝāĻĨāĻžāϝāĻŧ, āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϟāĻŋ āĻ…āĻ•ā§āώāĻŽ āĻ•āϰāĻžāϰ āĻĒāϰ⧇, Rules āĻŽā§‚āĻ˛ā§āϝāĻžāϝāĻŧāύ⧇āϰ āĻĢāϞ⧇ āφāĻĒāύāĻžāϰ āϏāĻžā§āϚāϝāĻŧāĻ¸ā§āĻĨāĻžāύ⧇āϰ āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞāĻŋ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāĻŦ⧇⧎

  2. āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻĒā§āϰāĻ¤ā§āϝāĻžāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ•ā§āϞāĻžāωāĻĄ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻŋāĻ•āĻž āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇ "Firebase āϰ⧁āϞāϏ āĻĢāĻžāϝāĻŧāĻžāϰāĻ¸ā§āĻŸā§‹āϰ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻāĻœā§‡āĻ¨ā§āϟ" āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻŽā§āĻ›āϤ⧇ Google āĻ•ā§āϞāĻžāωāĻĄ āĻ•āύāϏ⧋āϞ⧇āϰ IAM āĻĒ⧃āĻˇā§āĻ āĻžāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ⧎

āĻĒāϰ⧇āϰ āĻŦāĻžāϰ āϝāĻ–āύ āφāĻĒāύāĻŋ Firebase CLI āĻŦāĻž Firebase āĻ•āύāϏ⧋āϞ āĻĨ⧇āϕ⧇ āĻ•ā§āϰāϏ-āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻŦ⧇āύ āϤāĻ–āύ āφāĻĒāύāĻžāϕ⧇ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϟāĻŋ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϏāĻ•ā§āώāĻŽ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰāĻž āĻšāĻŦ⧇⧎