Cập nhật (20.160.521): căn cứ hỏa lực vừa phát hành một bản cập nhật lớn đến sản phẩm Firebase Authentication của nó, mà bây giờ cho phép một người sử dụng duy nhất để liên kết tài khoản từ các nhà cung cấp hỗ trợ khác nhau. Để tìm hiểu thêm về tính năng này, hãy đọc tài liệu cho iOS, Web và Android. Câu trả lời dưới đây được để lại vì lý do lịch sử. dịch vụ căn cứ hỏa lực
Cốt lõi cung cấp một số phương pháp để xác thực: https://www.firebase.com/docs/security/authentication.html
Tại cốt lõi của nó, căn cứ hỏa lực sử dụng thẻ JWT an toàn để xác thực. Bất kỳ thứ gì dẫn đến việc tạo mã thông báo JWT (chẳng hạn như sử dụng thư viện JWT trên máy chủ của riêng bạn) sẽ hoạt động để xác thực người dùng của bạn với Firebase, vì vậy bạn có toàn quyền kiểm soát quy trình xác thực.
Firebase cung cấp dịch vụ được gọi là Đăng nhập đơn giản Firebase, là một cách để tạo các mã thông báo này (điều này cung cấp cho Facebook, Twitter, vv auth của chúng tôi). Nó dành cho các kịch bản auth phổ biến để bạn có thể bắt đầu và chạy nhanh chóng mà không có máy chủ, nhưng nó không phải là cách duy nhất để xác thực và không phải là giải pháp toàn diện.
Dưới đây là một cách tiếp cận để cho phép đăng nhập với nhiều nhà cung cấp sử dụng căn cứ hỏa lực đơn giản Login:
- Cất giữ một định danh người dùng kinh điển cho mỗi người dùng, và một bản đồ cho mỗi nhà cung cấp cụ thể định danh với một id kinh điển.
- Cập nhật các quy tắc bảo mật của bạn để khớp với bất kỳ thông tin đăng nhập nào trên tài khoản người dùng được cấp thay vì chỉ một tài khoản.
Trong thực tế, các quy tắc an ninh có thể trông như thế này, giả sử bạn muốn kích hoạt cả Twitter và Facebook xác thực (hoặc cho phép người dùng tạo một tài khoản với một và sau đó thêm cái khác):
{
"users": {
"$userid": {
// Require the user to be logged in, and make sure their current credentials
// match at least one of the credentials listed below, unless we're creating
// a new account from scratch.
".write": "auth != null &&
(data.val() === null ||
(auth.provider === 'facebook' && auth.id === data.child('facebook/id').val() ||
(auth.provider === 'twitter' && auth.id === data.child('twitter/id').val()))"
}
},
"user-mappings": {
// Only allow users to read the user id mapping for their own account.
"facebook": {
"$fbuid": {
".read": "auth != null && auth.provider === 'facebook' && auth.id === $fbuid",
".write": "auth != null &&
(data.val() == null ||
root.child('users').child(data.val()).child('facebook-id').val() == auth.id)"
}
},
"twitter": {
"$twuid": {
".read": "auth != null && auth.provider === 'twitter' && auth.id === $twuid",
".write": "auth != null &&
(data.val() == null ||
root.child('users').child(data.val()).child('twitter-id').val() == auth.id)"
}
}
}
}
Trong ví dụ này, bạn lưu trữ một id người dùng toàn cầu (có thể là bất kỳ thứ gì bạn chọn) và duy trì ánh xạ giữa Facebook, Twitter, vv cơ chế xác thực cho bản ghi người dùng chính. Sau khi đăng nhập cho từng người dùng, bạn sẽ tìm nạp bản ghi người dùng chính từ ánh xạ người dùng và sử dụng id đó làm cửa hàng chính của dữ liệu người dùng và hành động. Ở trên cũng hạn chế và xác nhận dữ liệu trong ánh xạ người dùng sao cho nó chỉ có thể được viết bởi người dùng thích hợp đã có cùng tên người dùng Facebook, Twitter, v.v. dưới/users/$ userid/(facebook-id | twitter -id | etc-id).
Phương pháp này sẽ cho phép bạn bắt đầu và chạy nhanh. Tuy nhiên, nếu bạn có một trường hợp sử dụng phức tạp và muốn kiểm soát hoàn toàn trải nghiệm auth, bạn có thể chạy mã auth của riêng bạn trên các máy chủ của riêng bạn.Có nhiều thư viện nguồn mở hữu ích mà bạn có thể sử dụng để thực hiện việc này, chẳng hạn như everyauth và passport.
Bạn cũng có thể xác thực bằng cách sử dụng nhà cung cấp xác thực bên thứ 3. Ví dụ, bạn có thể sử dụng Singly, trong đó có một loạt các tích hợp out-of-the-box mà không cần phải viết bất kỳ mã phía máy chủ nào.
Tôi có một vài câu hỏi cho bạn về chiến lược này tìm thấy ở đây: http://stackoverflow.com/questions/22886053/can-the-firebase-auth-object -handle-synchronaneous-authentication-types –
Tôi không thể thấy sự khác biệt giữa '.child ('twitter/id'). val()' và '.child ('twitter-id'). val()'. Cả hai tham chiếu khác nhau? Tôi đã không bắt được nó. – Jobsamuel
Cảm ơn rất nhiều về ví dụ lập bản đồ. Có thể theo dõi một số mã về cách thực hiện điều này trên iOS không? –