安全規則和 Firebase 身份驗證

Firebase 安全規則以支持多級複雜性的格式提供訪問控制和數據驗證。構建基於用戶的,並且保持用戶的數據安全的基於角色的訪問系統,請使用火力地堡認證與火力地堡的安全規則。

識別用戶

身份驗證可識別請求訪問您的數據的用戶,並將該信息作為您可以在規則中利用的變量提供。該auth變量包含以下信息:

  • uid一個唯一的用戶ID,分配給發出請求的用戶。
  • token由認證收集的值的映射。

auth.token變量包含以下值:

場地描述
email與帳戶關聯的電子郵件地址(如果存在)。
email_verified true如果用戶驗證他們有權訪問email地址。一些提供商會自動驗證他們擁有的電子郵件地址。
phone_number與帳戶關聯的電話號碼(如果存在)。
name用戶的顯示名稱(如果已設置)。
sub用戶的 Firebase UID。這在項目中是獨一無二的。
firebase.identities與此用戶帳戶關聯的所有身份的字典。字典的鍵可以是下列任何一項: emailphonegoogle.comfacebook.comgithub.comtwitter.com 。字典的值是與帳戶關聯的每個身份提供者的唯一標識符數組。例如, auth.token.firebase.identities["google.com"][0]包含與該帳戶相關聯的第一谷歌用戶ID。
firebase.sign_in_provider用於獲取此令牌的登錄提供程序。可以是下列字符串之一: custompasswordphoneanonymousgoogle.comfacebook.comgithub.comtwitter.com

如果你想添加自定義的驗證屬性,該auth.token變量還包含任何自定義聲明指定。

當用戶請求訪問沒有登錄,則auth變量為null 。如果,例如,要限制對身份驗證的用戶讀取訪問,您可以在您的規則利用這一點- auth != null 。但是,我們通常建議進一步限制寫訪問。

有關更多信息auth變量,請參閱參考文檔雲公司的FireStore實時數據庫雲存儲

在規則中利用用戶信息

在實踐中,在您的規則中使用經過身份驗證的信息會使您的規則更加強大和靈活。您可以根據用戶身份控制對數據的訪問。

在你的規則,定義了信息如何auth變量-請求者的用戶信息-與請求的數據相關聯的用戶信息相匹配。

例如,您的應用可能希望確保用戶只能讀取和寫入他們自己的數據。在這種情況下,你會希望之間的匹配auth.uid變量和所請求的數據的用戶ID:

雲防火牆

service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

實時數據庫

{
  "rules": {
    "users": {
      "$userId": {
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($userId)
        ".write": "$userId === auth.uid"
      }
    }
  }
}

雲儲存

service firebase.storage {
  // Only a user can upload their file, but anyone can view it
  match /users/{userId}/{fileName} {
    allow read;
    allow write: if request.auth != null && request.auth.uid == userId;
  }
}

定義自定義用戶信息

您可以進一步充分利用auth變量定義分配給你的應用的用戶自定義字段。

例如,假設您要創建一個“管理員”角色,以啟用對某些路徑的寫訪問權限。您可以將該屬性分配給用戶,然後在授予路徑訪問權限的規則中利用它。

在 Cloud Firestore 中,您可以向用戶的文檔添加自定義字段,並通過規則中的嵌入讀取來檢索該字段的值。因此,您的基於管理員的規則將類似於以下示例:

雲防火牆

service cloud.firestore {
  match /databases/{database}/documents/some_collection: {
    // Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
    write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin) == true;
    read: if request.auth != null;
  }
}

對於規則的實時數據庫和雲存儲,創建自定義聲明的身份驗證。然後,您可以參考使用那些自定義聲明auth.token變量。

實時數據庫

{
  "rules": {
    "some_path/$sub_path": {
      // Create a custom claim for the admin role
      ".write": "auth.uid != null && auth.token.writer == true"
      ".read": "auth.uid != null"
      }
    }
  }

雲儲存

service firebase.storage {
  // Create a custom claim for the admin role
  match /files/{fileName} {
    allow read: if request.auth.uid != null;
    allow write: if request.auth.token.admin == true;
  }
}

要了解基本規則利用認證的更多示例,請參閱基本安全規則