Аутентификация с помощью пользовательского токена, электронной почты/пароля и/или внешних сторонних сервисов

В предыдущем руководстве мы узнали, как настроить firebase и firestore в нашем проекте TypeScript. В этой части мы собираемся обсудить аутентификацию с точки зрения серверной части.

Но прежде чем мы это сделаем, давайте обсудим первый тип облачных функций, предлагаемых Firebase, а именно облачную функцию onCall. OnCall предоставляется firebase в основном для упрощения аутентификации. Это выглядит так:

export const myFunction = functions.https.onCall(data, context) => {
   // function code here
}

Первый параметр в функции (данные) — это тело, отправляемое в облачную функцию. Например, если тело содержит поле с именем username, вы можете просто получить к нему доступ как

data.username

Второй параметр более интересен. Контекст включает в себя несколько битов данных, которые мы можем использовать для аутентификации и авторизации пользователей. Если мы просто хотим проверить, аутентифицирован ли пользователь и имеет ли он действительный токен, мы можем проверить:

if (context.auth) {
 // user is authenticated
else {
 // user isnt authenticated
}

Мы также можем получить доступ к любому из полей таблицы аутентификации (которые будут обсуждаться ниже), которые можно найти внутри context.auth, например, context.auth.uid, context.auth.displayName и т. д.

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

Аутентификация Firebase

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

Пользовательская аутентификация

Он также поддерживает пользовательскую аутентификацию, но здесь все немного сложнее. Если вы не хотите использовать ни одного из вышеперечисленных провайдеров и хотите реализовать собственную пользовательскую аутентификацию, это можно сделать за несколько шагов. Но прежде всего, давайте быстро разберемся, как это работает. Firebase использует стандартный веб-токен JSON (JWT) для аутентификации. Чтобы реализовать пользовательскую аутентификацию, нам нужно сгенерировать один из этих JWT через наш модуль администрирования на серверной части и подписать его с помощью учетной записи службы Google.

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

Источник: Облако Google

Есть 3 способа сделать это, перечисленные здесь. Тот, с которым мы собираемся, вот этот:

Использование JSON-файла сервисной учетной записи — этот метод можно использовать в любой среде, но он требует, чтобы вы упаковали JSON-файл сервисной учетной записи вместе с кодом. Особое внимание следует уделить тому, чтобы файл JSON служебной учетной записи не был доступен внешним сторонам.

Источник: Документы Firebase

Теперь просто перейдите в консоль Firebase -> Настройки проекта -> Учетные записи служб, а затем нажмите «Создать новый закрытый ключ»:

Это должно побудить вас загрузить необходимый serviceAccountKey, и мы будем использовать его точно так, как показано в приведенном выше фрагменте кода. Теперь давайте поместим serviceAccountKey.json в каталог нашего проекта, импортируем его и используем.

Давайте проверим это с Postman. Обратите внимание, что все функции firebase OnCall являются POST-запросами и имеют очень специфическую спецификацию протокола, которую вы можете найти здесь.

Также обратите внимание, что очень распространенной ошибкой здесь является неправильное размещение вашего serviceAccountKey.json. Вы должны понимать, что облачные функции Firebase компилируются в код JavaScript, который вы можете найти в functions/lib после запуска npm run start.

Таким образом, правильный каталог должен относиться к коду JS, а не к коду Typescript, который вы используете. Приведенный выше относительный путь будет работать, если вы поместите serviceAccountKey.json в самый внешний каталог.

Вот несколько моментов, на которые стоит обратить внимание:

  • Мы отправляем POST-запрос
  • Вы должны отправить его на правильный URL-адрес, который соответствует облачной функции.
  • Вы должны включить необработанное BODY типа JSON с полем data в соответствии со спецификацией протокола onCall.

Если запрос выполнен успешно, вы сможете увидеть пользователя, добавленного в базу данных, следующим образом:

Теперь, когда мы подписали токен JWT с нашей учетной записью службы и отправили его обратно в качестве ответа на успешную пользовательскую аутентификацию, последний шаг — использовать signInWithCustomToken() на стороне клиента. Это доступно в любой библиотеке аутентификации firebase либо в родной, либо по умолчанию.

Аутентификация по умолчанию

Предположим, что вам не нужна настраиваемая аутентификация, и вы просто хотите пройти аутентификацию с помощью электронной почты и пароля. Перейдите в консоль Firebase -> аутентификация -> Начать -> нажмите Электронная почта/пароль и включите его. Теперь, если вы нажмете «Аутентификация» (на левой панели), вы увидите пустую таблицу пользователей.

Мы также можем получить атрибуты по умолчанию, поддерживаемые таблицей аутентификации firebase, а именно:

К сожалению, вы не можете добавить больше полей в таблицу аутентификации.

Заключение

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

Однако будьте осторожны, чтобы не включать serviceAccountKey.json в свою производственную среду, поскольку она содержит конфиденциальную информацию. В следующем уроке мы обсудим горячую перезагрузку, утилиты firestore, транзакции и многое другое!