Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Quy tắc bảo mật Firebase cung cấp quyền 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 các hệ thống truy cập dựa trên vai trò và dựa trên người dùng nhằm giữ an toàn cho dữ liệu của người dùng, hãy sử dụng Xác thực Firebase với Quy tắc bảo mật Firebase.

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 đó dưới dạng một biến mà bạn có thể tận dụng trong các quy tắc của mình. Biến auth chứa các thông tin sau:

  • uid : ID người dùng duy nhất, được gán cho người dùng yêu cầu.
  • token : Bản đồ các giá trị được thu thập bởi Xác thực.

Biến auth.token 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 minh rằng họ có quyền truy cập vào địa chỉ email . 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 Firebase UID 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 khóa của từ điển có thể là bất kỳ khóa nào 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 từng 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 ID người dùng Google đầu tiên được liên kết với tài khoản.
firebase.sign_in_provider Nhà cung cấp dịch vụ đăng nhập đã sử dụng để nhận mã thông báo này. Có thể là một trong các chuỗi sau: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .
firebase.tenant tenantId được liên kết với tài khoản, nếu có. ví dụ: tenant2-m6tyz

Nếu bạn muốn thêm các thuộc tính xác thực tùy chỉnh, thì biến auth.token cũng chứa bất kỳ xác nhận quyền sở hữu tùy chỉnh nào mà bạn chỉ định.

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

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

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

Trong thực tế, việc sử dụng thông tin xác thực trong quy tắc của bạn làm cho 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 các quy tắc của bạn, hãy xác định cách thông tin trong biến auth thực — thông tin người dùng của người yêu cầu — khớp với thông tin người dùng được liên kết với dữ liệu được yêu cầu.

Ví dụ: ứng dụng của bạn có thể muốn đảm bảo rằng người dùng chỉ có thể đọc và ghi dữ liệu của chính họ. Trong trường hợp này, bạn muốn khớp giữa biến auth.uid và ID người dùng trên dữ liệu được yêu cầu:

Cửa hàng lửa trên đám mây

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ể tận dụng thêm biến auth để xác định các trường tùy chỉnh được chỉ định cho người dùng ứng dụng của mình.

Ví dụ: giả sử bạn muốn tạo 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, sau đó tận dụng nó 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 đó bằng nội dung đọ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:

Cửa hàng lửa trên đám mây

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

Bạn có thể truy cập các xác nhận quyền sở hữu tùy chỉnh trong Quy tắc sau khi tạo các xác nhận quyền sở hữu tùy chỉnh trong Xác thực. Sau đó, bạn có thể tham chiếu các xác nhận quyền sở hữu tùy chỉnh đó bằng cách sử dụng biến auth.token .

Cửa hàng lửa trên đám mây

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

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 thêm các ví dụ về Quy tắc cơ bản tận dụng Xác thực, hãy xem Quy tắc bảo mật cơ bản .