2013-02-03 30 views
39

Do cần phải làm một số mã phía máy chủ - chủ yếu là gửi email, tôi đã quyết định sử dụng Nodejs & Express cho phần tử phía máy chủ cùng với Firebase để giữ dữ liệu - Một phần từ trải nghiệm học tập.Sử dụng NodeJ với Firebase - Bảo mật

Câu hỏi của tôi là cách tiếp cận tốt nhất liên quan đến việc sử dụng thư viện Firebase phía máy khách và thư viện Nodejs khi thực hiện xác thực bằng API đơn giản & mật khẩu. Nếu tôi thực hiện phía máy khách xác thực và sau đó gọi một tuyến khác ở bên NodeJS thì việc xác thực cho người dùng đó sẽ được thực hiện trong yêu cầu. Cách tiếp cận để kiểm tra người dùng được xác thực trong Node là gì.

Một cách tiếp cận tôi giả định là lấy tên người dùng hiện tại & mật khẩu từ firebase và sau đó đăng chúng lên NodeJS và sau đó sử dụng API bảo mật firebase trên máy chủ để kiểm tra.

Trả lời

56

Về cơ bản vấn đề ở đây là bạn cần phải truyền đạt an toàn đến máy chủ NodeJS của bạn mà khách hàng được xác thực là Firebase. Có một số cách bạn có thể đi về điều này, nhưng dễ nhất là có thể có tất cả các khách hàng của bạn < -> NodeJS truyền thông đi qua Firebase chính nó.

Vì vậy, thay vì để ứng dụng khách chạm vào điểm cuối REST được phục vụ bởi máy chủ NodeJS của bạn, hãy ghi ứng dụng khách vào vị trí Firebase mà máy chủ NodeJS của bạn đang giám sát. Sau đó, bạn có thể sử dụng Quy tắc bảo mật Firebase để xác thực dữ liệu do khách hàng viết và máy chủ của bạn có thể tin tưởng nó. Ví dụ, nếu bạn muốn làm cho nó để người dùng có thể gửi email tùy ý thông qua ứng dụng của bạn (với máy chủ NodeJS của bạn chăm sóc thực sự gửi email), bạn có thể có/email_to_send vị trí với các quy tắc như thế này:

{ 
    "rules": { 
    "emails_to_send": { 
     "$id": { 
     ".write": "!data.exists() && newData.child('from').val() == auth.email", 
     ".validate": "newData.hasChildren(['from', 'to', 'subject', 'body'])" 
     } 
    } 
    } 
} 

sau đó, trong khách hàng mà bạn có thể làm:

ref.child('emails_to_send').push({ 
    from: '[email protected]', 
    to: '[email protected]', 
    subject: 'hi', 
    body: 'Hey, how\'s it going?' 
}); 

và trong mã NodeJS của bạn, bạn có thể gọi .auth() với căn cứ hỏa lực bí mật của bạn (để bạn có thể đọc và viết tất cả mọi thứ) và sau đó thực hiện:

ref.child('emails_to_send').on('child_added', function(emailSnap) { 
    var email = emailSnap.val(); 
    sendEmailHelper(email.from, email.to, email.subject, email.body); 

    // Remove it now that we've processed it. 
    emailSnap.ref().remove(); 
}); 

Đây sẽ là giải pháp dễ nhất cũng như chính xác nhất. Ví dụ: nếu người dùng đăng xuất qua Firebase, họ sẽ không còn có thể ghi vào Firebase để họ không còn có thể làm cho máy chủ NodeJS của bạn gửi email, mà rất có thể là hành vi bạn muốn. Nó cũng có nghĩa là nếu máy chủ của bạn tạm thời ngừng hoạt động, khi bạn khởi động lại, nó sẽ "bắt kịp" gửi email và mọi thứ sẽ tiếp tục hoạt động.

+2

Đó là lời khuyên tuyệt vời - cảm ơn. Có thể tài liệu firebase có thể được mở rộng để bao gồm loại tư vấn kiến ​​trúc này. – markbarton

+3

Điểm tốt. Tôi sẽ xem những gì chúng ta có thể làm. :-) –

+0

Bằng cách này, xử lý lỗi khi gửi email cũng phải được thực hiện thông qua Firebase ... FYI – tomericco

0

Ở trên có vẻ giống như một cách xoay vòng để làm việc, tôi sẽ sử dụng một cái gì đó như https://www.npmjs.com/package/connect-session-firebase và giữ cho firebase làm mô hình, xử lý tất cả các tuyến đường thông qua express. Dễ dàng hơn nếu máy chủ tốc hành của bạn hiển thị mẫu và không chỉ hoạt động như một API JSON.

Các vấn đề liên quan