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