Защитите свое приложение Gatsby, используя аутентификацию Firebase

TL;DR

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

  • Полноценные процессы входа и регистрации.
  • Безопасная аутентификация по электронной почте/паролю.
  • Сброс пароля
  • Защищенная страница профиля пользователя.
  • Развертывание в Netlify

Работающее демо-приложение доступно здесь. Предоставляется полный исходный код.

О Гэтсби

Созданный в 2015 году, Gatsby представляет собой генератор статических сайтов с открытым исходным кодом, построенный поверх Node.js с использованием React и GraphQL. Он предоставляет более 2500 плагинов для создания статических сайтов на основе таких источников, как документы Markdown, MDX, изображения и многочисленные системы управления контентом, такие как WordPress, Drupal и другие. Это происходит молниеносно благодаря тому, что на стороне сервера JavaScript преобразуется в статические файлы сайта, которые минимизированы и могут обслуживаться через сеть доставки контента.

Поскольку все страницы в Gatsby отображаются как статический контент, аутентификация пользователя на вашем сайте Gatsby не может выполняться на сервере, а должна быть защищена маршрутизацией на стороне клиента.

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

Отправная точка

Нашей отправной точкой является простой поток аутентификации, доступный в папке примеров Gatsby. Я разветвил проект Gatsby и создал здесь отправную точку с простой аутентификацией: https://github.com/mlomboglia/simple-auth.

Просто клонируйте проект:

$ git clone https://github.com/mlomboglia/simple-auth
$ cd simple-auth

Я предполагаю, что у вас уже установлен NodeJS. Если нет, вы можете установить его здесь:



Обновите до последней версии Gatsby

В корневой папке вашего проекта

$ npm install gatsby@latest --legacy-peer-deps

Настройка Firebase

Firebase Authentication предоставляет серверные службы, простые в использовании SDK и готовые библиотеки пользовательского интерфейса для аутентификации пользователей в вашем приложении. Он поддерживает аутентификацию с использованием паролей, телефонных номеров, популярных поставщиков федеративных удостоверений, таких как Google, Facebook и Twitter, и т. д.

Firebase Authentication тесно интегрируется с другими сервисами Firebase и использует отраслевые стандарты, такие как OAuth 2.0 и OpenID Connect, поэтому его можно легко интегрировать с вашим настраиваемым бэкендом.

Для этой демонстрации я настрою поставщика аутентификации по электронной почте/паролю. Доступны многие другие варианты.

Откройте консоль Firebase.

Добавьте новый проект, выберите имя и создайте проект:

Нажмите на веб-значок, чтобы добавить новое веб-приложение:

Скопируйте элементы конфигурации Firebase и сохраните их на потом.

Я добавлю их как переменные окружения.

Нажмите «Аутентификация».

Включите опцию «Электронная почта/пароль».

В корневой папке вашего проекта установите Firebase SDK.

$ npm i firebase

Компонент Firebase

Теперь давайте создадим компонент Firebase.

Откройте свою любимую IDE. Я использую код Visual Studio.

Создайте папку Firebase на своем src/components.

Создайте Firebase.js файл:

Переменные среды

Gatsby имеет встроенную поддержку загрузки переменных среды в браузер и функции.

Чтобы загрузить их в Node.js, добавьте следующий фрагмент кода в начало файла gatsby-config.js:

require("dotenv").config({
   path: `.env.${process.env.NODE_ENV}`, 
})

В процессе разработки Gatsby будет загружать переменные среды из файла с именем .env.development. Для сборок он будет загружаться из .env.production.

Создайте файл env.development в корневой папке проекта.

Добавьте следующие переменные:

GATSBY_FIREBASE_API_KEY=<from firebase console config>
GATSBY_FIREBASE_AUTH_DOMAIN=<from firebase console config>
GATSBY_FIREBASE_DATABASE_URL=<from firebase console config>
GATSBY_FIREBASE_PROJECT_ID=<from firebase console config>
GATSBY_FIREBASE_STORAGE_BUCKET=<from firebase console config>
GATSBY_FIREBASE_MESSAGING_SENDER_ID=<from firebase console config>
GATSBY_FIREBASE_APP_ID=<from firebase console config>
GATSBY_FIREBASE_MEASUREMENT_ID=<from firebase console config>

Добавьте .env* файлов в .gitignore

Файлы переменных среды не следует фиксировать в Git, поскольку они часто содержат секреты, которые небезопасно добавлять в Git. Вместо этого добавьте .env.* в файл .gitignore и настройте переменные среды вручную в Gatsby Cloud и локально.

Контекстный API реакции

Чтобы управлять состоянием нашего user на глобальном уровне на нашем сайте Gatsby, мы внедрим React Context API. Давайте завернем корневой элемент Gatsby в нашего поставщика контекста, чтобы гарантировать, что наше значение контекста будет доступно для всех наших потребляющих компонентов в нашем приложении.

Подробнее о Context можно прочитать в Документации React.

Контекст

Создайте папку Auth внутри папки компонентов.

Создайте файл AuthContext.js.

Чтобы все наши компоненты в нашем приложении стали потребителями контекста, нам нужно обернуть наш пользовательский компонент <AuthProvider> вокруг корневого элемента Gatsby.

Давайте используем вспомогательный функциональный компонент wrapRootElement в нашем файле AuthContext.js, который экспортирует наш компонент <AuthProvider>, обернутый вокруг реквизита { element }, который будет передан нашей функции wrapRootElement. Все, что нам нужно сделать сейчас, это использовать gatsby-browser.js для импорта (и немедленного экспорта) нашей функции wrapRootElement.

Откройте gatsby-browser.js в каталоге проекта и добавьте:

Положение дел

Компонент «Статус» покажет, аутентифицирован ли пользователь или нет.

Отредактируйте index.js в папке Status:

Маршрутизация

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

Используя библиотеку @reach/router, вы можете создавать маршруты, доступные только авторизованным пользователям. Эта библиотека используется Гэтсби под капотом, поэтому вам даже не нужно ее устанавливать.

Сначала создайте gatsby-node.js в корневом каталоге вашего проекта. Вы определите, что любой маршрут, начинающийся с /app/, является частью вашего контента с ограниченным доступом, и страница будет создаваться по запросу:

Теперь мы собираемся создать страницу в нашей папке ./src/pages/ с именем app.js, которая будет импортировать наши компоненты и использовать помощник из библиотеки @reach/router для обработки динамической маршрутизации только для клиента. Создайте файл в ./src/pages/app.js, который будет выглядеть так:

Логин Маршрут

Для компонента Login я буду использовать метод signInWithEmailAndPassword, доступный в библиотеке firebase/auth:

Создайте Login.js в папке компонентов

Регистрация Маршрут

Чтобы зарегистрировать пользователя, мы можем использовать метод createUserWithEmailAndPassword, доступный в компоненте firebase/auth:

Создайте Register.js в папке компонентов

Сбросить пароль Маршрут

Аналогично для сброса пароля, я буду использовать sendPasswordResetEmail

Создайте Reset.js:

Firebase позволяет настроить домен электронной почты и шаблон сообщения электронной почты для сброса пароля.

Компонент частного маршрута

Компонент <PrivateRoute /> проверит, аутентифицирован ли пользователь или нет. Если текущий пользователь существует, он загрузит закрытый компонент.

Создайте PrivateRoute.js в папке компонентов.

Безопасный маршрут профиля

Маршрут профиля будет загружен, если пользователь аутентифицирован.

Создайте Profile.js в папке components.

Заголовок

На своем Header/index.js скорректируйте ссылку на <Link to=”/app/profile” className={header__link}>

Тестирование

Теперь мы готовы протестировать приложение

Запустите приложение, используя $ gatsby develop

Открыть http://localhost:8000/

Зарегистрируйте нового пользователя, войдите в систему, чтобы перейти к экрану профиля.

Рабочее демо-приложение доступно здесь

Полный исходный код доступен здесь:



Развертывание сети

Давайте развернем наше приложение на Netlify.

Зафиксируйте весь свой код в своем любимом провайдере Git, таком как Github.

Создайте учетную запись Netlify (регистрация бесплатна), если у вас ее нет.

Шаг 1: Добавьте свой новый сайт

Нажмите кнопку Добавить новый сайт → Импортировать из шаблона.

Шаг 2. Установите связь с вашим поставщиком Git (или поддерживаемым инструментом контроля версий)

Я использую GitHub. Отправьте свое репо на GitHub, так что все, что нам нужно сделать, это связать Netlify с GitHub. Нажмите кнопку GitHub, как показано на снимке экрана выше.

Шаг 3: Авторизуйте Netlify

Если это не авторизовано, разрешите Netlify и GitHub общаться друг с другом, нажав кнопку «Авторизовать».

Шаг 4: выберите репозиторий

Теперь, когда вы подключили Netlify и GitHub, вы можете увидеть список своих репозиториев Git. Выберите репозиторий, который вы хотите развернуть, из списка. Нажмите Развернуть сайт.

Через несколько минут вы увидите свой новый сайт в списке.

Шаг 5: Настройте параметры

Нажмите «Настройки сайта» → «Сборка и развертывание» → «Среда».

Добавьте свои переменные среды, как они есть в файле env.development.

Шаг 6: Создайте свой сайт

Восстановите свой сайт!

Шаг 7. Авторизуйте свой домен в Firebase

Теперь нам нужно авторизовать новый домен в Firebase.

Перейдите в консоль Firebase → Аутентификация → Настройки.

Нажмите «Добавить домен» и добавьте домен развернутого приложения Netlify в список авторизованных.

Шаг 8: Протестируйте свое приложение в Netlify

Щелкните URL-адрес своего приложения в Netlify, и у вас должна быть полная рабочая версия потока аутентификации Gatsby с развернутым Firebase.

Сделанный!