Catch up on everthing we announced at this year's Firebase Summit. Learn more

Quy tắc bảo mật và Xác thực Firebase

Quy tắc bảo mật của Firebase cung cấp khả năng kiểm soát truy cập và xác thực dữ liệu ở định dạng hỗ trợ nhiều mức độ phức tạp. Để xây dựng hệ thống truy cập dựa trên vai trò mà giữ an toàn dữ liệu của người dùng dựa trên người dùng và sử dụng căn cứ hỏa lực xác thực với Quy định an toàn căn cứ hỏa lực.

Xác định người dùng

Xác thực xác định người dùng yêu cầu quyền truy cập vào dữ liệu của bạn và cung cấp thông tin đó như một biến số mà bạn có thể tận dụng trong các quy tắc của mình. Các auth biến chứa các thông tin sau:

  • uid : Một người sử dụng ID duy nhất, gán cho người dùng yêu cầu.
  • token : Một bản đồ của các giá trị thu được bằng cách xác thực.

Các auth.token biến chứa các giá trị sau:

Đồng ruộng Sự miêu tả
email Địa chỉ email được liên kết với tài khoản, nếu có.
email_verified true nếu người dùng đã xác nhận họ có quyền truy cập vào email địa chỉ. Một số nhà cung cấp tự động xác minh địa chỉ email mà họ sở hữu.
phone_number Số điện thoại được liên kết với tài khoản, nếu có.
name Tên hiển thị của người dùng, nếu được đặt.
sub UID Firebase của người dùng. Điều này là duy nhất trong một dự án.
firebase.identities Từ điển của tất cả các danh tính được liên kết với tài khoản của người dùng này. Các phím của từ điển có thể là bất kỳ những điều sau đây: email , phone , google.com , facebook.com , github.com , twitter.com . Các giá trị của từ điển là mảng các số nhận dạng duy nhất cho mỗi nhà cung cấp danh tính được liên kết với tài khoản. Ví dụ, auth.token.firebase.identities["google.com"][0] chứa các ID người dùng Google đầu tiên liên quan đến tài khoản.
firebase.sign_in_provider Nhà cung cấp dịch vụ đăng nhập đã sử dụng để lấy mã thông báo này. Có thể là một trong những chuỗi kí tự sau: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .

Nếu bạn muốn thêm các thuộc tính xác thực tùy biến, các auth.token biến cũng chứa bất kỳ tuyên bố tùy chỉnh bạn chỉ định.

Khi người dùng yêu cầu truy cập không được đăng nhập, các auth biến là null . Bạn có thể tận dụng điều này trong quy tắc của bạn nếu, ví dụ, bạn muốn giới hạn quyền truy cập đọc để xác thực người dùng - auth != null . Tuy nhiên, chúng tôi thường khuyên bạn nên hạn chế truy cập ghi hơn nữa.

Để biết thêm thông tin về auth biến, xem tài liệu tham khảo cho các đám mây FireStore , Cơ sở dữ liệu thời gian thực , và Cloud Storage .

Tận dụng thông tin người dùng trong các quy tắc

Trên thực tế, việc sử dụng thông tin xác thực trong các quy tắc của bạn làm cho các quy tắc của bạn trở nên mạnh mẽ và linh hoạt hơn. Bạn có thể kiểm soát quyền truy cập vào dữ liệu dựa trên danh tính người dùng.

Trong quy tắc của bạn, xác định cách các thông tin trong auth biến - thông tin người dùng của người yêu cầu - phù hợp với thông tin người dùng kết hợp với các dữ liệu được yêu cầu.

Ví dụ: ứng dụng của bạn có thể muốn đảm bảo người dùng chỉ có thể đọc và ghi dữ liệu của riêng họ. Trong tình huống này, bạn sẽ muốn có một trận đấu giữa auth.uid biến và ID người dùng trên các dữ liệu được yêu cầu:

Cloud Firestore

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;
    }
  }
}

Cơ sở dữ liệu thời gian thực

{
  "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"
      }
    }
  }
}

Lưu trữ đám mây

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;
  }
}

Xác định thông tin người dùng tùy chỉnh

Bạn có thể tiếp tục tận dụng auth biến để xác định các lĩnh vực tùy chỉnh gán cho người dùng của ứng dụng.

Ví dụ: giả sử bạn muốn tạo một vai trò "quản trị viên" cho phép truy cập ghi trên các đường dẫn nhất định. Bạn sẽ gán thuộc tính đó cho người dùng, rồi tận dụng thuộc tính đó trong các quy tắc cấp quyền truy cập trên các đường dẫn.

Trong Cloud Firestore, bạn có thể thêm trường tùy chỉnh vào tài liệu của người dùng và truy xuất giá trị của trường đó với giá trị đọc được nhúng trong quy tắc của bạn. Vì vậy, quy tắc dựa trên quản trị viên của bạn sẽ giống như ví dụ sau:

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;
  }
}

Đối với quy tắc trong cơ sở dữ liệu thời gian thực và Cloud Storage, tạo tuyên bố tùy chỉnh trong xác thực. Sau đó bạn có thể tham khảo những tuyên bố tùy chỉnh bằng cách sử dụng auth.token biến.

Cơ sở dữ liệu thời gian thực

{
  "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"
      }
    }
  }

Lưu trữ đám mây

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;
  }
}

Để xem chi tiết ví dụ về các nguyên tắc cơ bản tận dụng xác thực, xem Quy định bảo mật cơ bản .