Когда вы создаете облачные функции своего приложения с помощью 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 (или выход, когда вы обращаетесь к сервису в другом месте) стоит ваших денег, вам следует подумать об оптимизации приведенного выше кода. Исключение предварительных проверок в функциях промежуточного программного обеспечения и расширение объекта запроса данными, которые в любом случае должны быть получены по соображениям (безопасности) - отличный способ сделать это, одновременно увеличив читаемость и возможность повторного использования вашего кода. Вот пример того, как этого добиться:

Обеспечьте гибкость, используя методы составления

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

Заключение

Этот пост был посвящен использованию функций промежуточного программного обеспечения в основном для целей разрешений в облачных функциях. Но их удобство использования не ограничивается этим. Вы также можете объединить их со структурой проверки схемы и использовать их, например, для проверки отправленных полезных данных.

Если вы хотите узнать больше об этой теме, не стесняйтесь оставлять комментарии.

С Рождеством! 🎄