Совместим ли пакет firebase JS SDK с Node.js среда облачной функции? Зачем использовать firebase-admin?

#javascript #node.js #firebase #google-cloud-functions #firebase-admin

#javascript #node.js #firebase #google-cloud-функции #firebase-admin

Вопрос:

Я знаю, что если вы находитесь в серверной среде, вероятно, имеет смысл использовать firebase-admin SDK, который предоставит вам статус администратора в доверенной среде, например, в облачной функции.

Но эти два пакета всегда приводили меня в замешательство: firebase JS SDK и firebase-admin .

Смотрите этот отрывок из firebase JS SDK

https://www.npmjs.com/package/firebase

Этот SDK предназначен для клиентского доступа конечных пользователей из таких сред, как Web, mobile Web (например, React Native, Ionic),Node.js настольные (например, Electron) или IoT-устройства, работающие Node.js . Если вместо этого вы заинтересованы в использовании Node.js SDK, который предоставляет вам доступ администратора из привилегированной среды (например, сервера), вы должны использовать Firebase Admin Node.js SDK.

Долгое время я думал, что firebase JS SDK полностью несовместим с Node.js среда облачной функции, и что простое присутствие или import * as firebase from "firebase/app"; может нарушить код моей функции. Но сегодня я узнал, что это не так. Так ли это?

Теоретически, могу ли я использовать firebase пакет для вызова служб firebase из Node.js среда облачной функции?

Помимо наличия прав администратора, если я собираюсь выполнить простую задачу, такую как чтение firestore документа, есть ли причина, по которой я должен предпочесть использовать firebase-admin вместо firebase пакета JS SDK?

Ответ №1:

Вы можете использовать firebase в Node.js среда для доступа к определенным службам. Однако эти вызовы службы будут выполняться так, как если бы они были сделаны конечным пользователем. Это означает, что в игру вступают все правила безопасности, квоты запросов для каждого пользователя и механизмы предотвращения злоупотреблений на внутренних серверах Firebase. Если ваши правила разрешают доступ к Firestore только пользователям, прошедшим проверку подлинности, тогда вам придется пройти аутентификацию как конечному пользователю на сервере перед вызовом Firestore. Каждый вызов облачной функции должен будет выполнять это, поскольку функции не сохраняют состояние. Выполнение такого количества попыток аутентификации с одного и того же IP-блока, вероятно, в конечном итоге приведет к некоторой защите от злоупотреблений и приведет к ошибкам.

Как правило, используйте клиентский SDK для клиентских приложений и используйте серверный / Admin SDK для серверных приложений. Бывают случаи, когда вы можете захотеть обойти это правило. Но это должно быть исключением, в отличие от нормы, и должно выполняться только после тщательного рассмотрения.

Комментарии:

1. Я понимаю, что вы имеете в виду. Большое спасибо за ваш ответ, Хиранья!

Ответ №2:

Теоретически, могу ли я использовать пакет firebase для вызова служб firebase из Node.js среда облачной функции?

Firestore web SDK, предоставляемый Firebase, не предназначался для использования в средах nodejs. Если это сработает, я бы счел это бонусом. Но я бы вообще этого не ожидал, и я бы определенно не зависел от этого.

есть ли причина, по которой я должен предпочесть использовать firebase-admin вместо пакета firebase JS SDK?

Основная причина в том, что firebase-admin специально поддерживает nodejs. Вот как это должно было работать. Admin SDK — это просто оболочка Firestore SDK, предоставляемая Google Cloud. Как только у вас есть объект Firestore, это точно такой же материал.

Как я упоминал в вашем другом вопросе, пакеты SDK могут выглядеть похожими, но они не совпадают. У них нет одинаковых функций и API.

Комментарии:

1. Большое спасибо за твой ответ, Дуг. Я буду использовать firebase-admin обязательно. Но если firebase установлен как зависимость в functions/package.json , и некоторые файлы импортируют его… В этом нет вреда, верно? На самом деле он не будет использоваться на сервере, поскольку вызовы к нему выполняются либо с помощью обработчиков событий, либо с помощью useEffects, и renderToString они не будут запускаться.

2. Добавление зависимости не приводит к выполнению какого-либо кода этой зависимости. Импорт из этой зависимости начнет загружать и выполнять код, который может сделать то, чего вы не ожидаете. Вам придется определить для себя, является ли что-то вредным.