Подтвердить что ты не робот

Использование NodeJs с Firebase - Безопасность

Из-за необходимости делать код на стороне сервера - в основном, отправляя электронные письма, я решил использовать Nodejs и Express для элемента на стороне сервера вместе с Firebase для хранения данных. Частично из опыта обучения.

Мой вопрос заключается в том, как лучше всего использовать библиотеку Firebase на стороне клиента и библиотеку Nodejs при выполнении аутентификации с помощью Simple Email и Password API. Если я сделаю клиентскую часть аутентификации, а затем вызову другой маршрут на стороне NodeJS, аутентификация для этого пользователя будет перенесена в запрос. Каким будет подход к тестированию пользователя, аутентифицируется в пределах Node.

Один из подходов, который я предполагаю, заключается в том, чтобы получить имя пользователя и пароль текущего пользователя от firebase, а затем отправить их в NodeJS, а затем использовать для проверки проверку безопасности на базе сервера firebase.

4b9b3361

Ответ 1

По существу, проблема здесь заключается в том, что вам необходимо безопасно передать серверу NodeJS, которому клиент аутентифицирован как Firebase. Есть несколько способов, которыми вы могли бы это сделать, но самым легким, возможно, является то, что все ваши клиентские и коммуникационные связи проходят через Firebase.

Поэтому вместо того, чтобы клиент попал в конечную точку REST, обслуживаемую вашим сервером NodeJS, попросите клиента записать в местоположение Firebase, которое контролирует ваш NodeJS-сервер. Затем вы можете использовать правила безопасности Firebase для проверки данных, написанных клиентом, и ваш сервер может доверять ему.

Например, если вы хотите сделать так, чтобы пользователи могли отправлять произвольные письма через ваше приложение (с вашим сервером NodeJS, заботясь о фактической отправке писем), вы могли бы иметь расположение /emails _to_send с правилами примерно так:

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

Затем в клиенте вы можете:

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

И в коде NodeJS вы можете вызвать .auth() с вашей Firebase Secret (чтобы вы могли читать и писать все), а затем выполните:

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

Это будет самое простое, а также самое правильное решение. Например, если пользователь выходит из системы Firebase, они больше не смогут писать в Firebase, поэтому они больше не смогут отправлять ваши NodeJS-серверы по электронной почте, что, скорее всего, будет поведением, которое вы хотите. Это также означает, что если ваш сервер временно не работает, когда вы начнете его резервное копирование, он "догонит" отправку писем, и все будет продолжать работать.

Ответ 2

Вышеизложенное похоже на окольный способ делать вещи, я бы использовал что-то вроде https://www.npmjs.com/package/connect-session-firebase и держит firebase в качестве модели, обрабатывая все маршруты через экспресс. Легче, если ваш экспресс-сервер создает шаблоны и не просто ведет себя как JSON API.