Когда вы создаете облачные функции своего приложения с помощью Node.js, Google предлагает возможность напрямую взаимодействовать с базовым фреймворком веб-приложений Express.js. Функции промежуточного программного обеспечения - это основная концепция Express, поэтому вам обязательно стоит подумать об использовании их преимуществ.
Приложение Express - это, по сути, серия вызовов функций промежуточного программного обеспечения. [Документация Express.js]
Следующие методы и шаблоны, относящиеся к функциям промежуточного программного обеспечения, явно не рассматриваются в документации по облачным функциям Googles, но отлично работают вместе с общими вариантами использования, которые вы, вероятно, захотите охватить в своем проекте Firebase. Эти советы могут помочь вам структурировать код или даже сэкономить деньги, избегая ненужных вызовов API (например, при доступе к Cloud Firestore).
Извлекайте часто необходимые задачи в их собственное промежуточное ПО
Вполне вероятно, что ваше приложение будет использовать некоторые облачные функции, особенно если вы хотите выполнить какую-либо аутентификацию или проверку отправленных полезных данных. Представьте, что ваше приложение каким-то образом управляет объектами ресторана. Только владельцы ресторанов смогут изменять или удалять ресторан. Следовательно, обе конечные точки должны будут подтвердить, что запрос аутентифицирован. Функции промежуточного программного обеспечения - хороший подход для безопасного достижения этого поведения в удобочитаемой форме.
Говоря о коде, промежуточное ПО Express - это, по сути, функция, принимающая запрос, ответ и «следующую функцию». Учитывая эти значения, вы можете обрабатывать всю логику аутентификации внутри функции.
После внедрения вы можете легко подключить промежуточное ПО к каждому пути вашего Express-приложения.
Возможно, вы спросили себя, откуда взялось промежуточное ПО onlyLoggedInUsers в приведенном выше примере. Это промежуточное ПО обрабатывает заголовок Authorization
, который ваш клиент отправляет через Firebase SDK. Если вы используете аутентификацию Firebase по умолчанию, вы можете просто использовать промежуточное ПО, которое Google предоставляет в своем репозитории.
Их код будет обрабатывать аутентификацию, чтобы получить уникальный идентификатор пользователя запрашивающего пользователя. Если пользователь не вошел в систему, запрос не будет выполнен. После того, как промежуточное программное обеспечение завершит свою работу, все следующие функции промежуточного программного обеспечения в цепочке будут иметь доступ к req.user
.
Возможность расширения объекта запроса в промежуточном программном обеспечении (например, добавление user
к объекту req
) является важной частью базового механизма, поскольку вы можете легко использовать это для сохранения запросов API или базы данных:
Сохраните вызовы API (например, вызовы Firestore), расширив объект запроса
Вероятно, что для некоторых проверок разрешений потребуется доступ к внешнему API или базе данных. В случае с Firestore (или облачным хранилищем) это произойдет, когда вы не сможете защитить свои данные, просто используя правила безопасности (вот отличное чтение по этой теме).
Возьмем пример сверху: представьте, что ваш ресторан сможет получать звезды Мишлен в качестве награды за отличную еду. Это событие повлияет не только на ресторан. Шеф-повар соответствующего ресторана будет отмечен на своеобразной «стене славы».
Когда вы обращаетесь к своим данным Firestore в облачной функции (не уверены, действительно ли это нужно? Прочтите!) С функциями промежуточного программного обеспечения, вы можете получить код, который приведет к избыточному доступу к базе данных, потому что в Javascript промежуточное программное обеспечение и фактическое функция не будет использовать один и тот же контекст.
Поскольку чтение и запись Firestore (или выход, когда вы обращаетесь к сервису в другом месте) стоит ваших денег, вам следует подумать об оптимизации приведенного выше кода. Исключение предварительных проверок в функциях промежуточного программного обеспечения и расширение объекта запроса данными, которые в любом случае должны быть получены по соображениям (безопасности) - отличный способ сделать это, одновременно увеличив читаемость и возможность повторного использования вашего кода. Вот пример того, как этого добиться:
Обеспечьте гибкость, используя методы составления
По мере роста вашего приложения может потребоваться реализация более сложной концепции разрешений. Особенно при работе с несколькими группами пользователей вам потребуется реализовать больше функций промежуточного программного обеспечения, реализация которых в основном такая же. Если вы дойдете до этого момента, вам следует подумать о создании промежуточного программного обеспечения с так называемыми каррированными функциями. Этот последний пример кода даст вам обзор того, как этого добиться:
Заключение
Этот пост был посвящен использованию функций промежуточного программного обеспечения в основном для целей разрешений в облачных функциях. Но их удобство использования не ограничивается этим. Вы также можете объединить их со структурой проверки схемы и использовать их, например, для проверки отправленных полезных данных.
Если вы хотите узнать больше об этой теме, не стесняйтесь оставлять комментарии.
С Рождеством! 🎄