Аутентификация с помощью пользовательского токена, электронной почты/пароля и/или внешних сторонних сервисов
В предыдущем руководстве мы узнали, как настроить 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, транзакции и многое другое!