С новой облачной функцией firebase я решил переместить часть моей конечной точки HTTP на firebase. Все отлично работает ... Но у меня такая проблема. У меня две конечные точки, построенные с помощью триггеров HTTP (облачные функции)
- Конечная точка API для создания пользователей и возвращает пользовательский токен, созданный Firebase Admin SDK.
- Конечная точка API для получения определенных сведений о пользователе.
Хотя первая конечная точка в порядке, но для моей второй конечной точки я хотел бы защитить ее только для аутентифицированных пользователей. Имеется в виду тот, у кого есть токен, который я сгенерировал ранее.
Как мне решить эту проблему?
Я знаю, что мы можем получить параметры заголовка в облачной функции, используя
request.get('x-myheader')
но есть ли способ защитить конечную точку так же, как защиту базы данных в реальном времени?
Ответы:
Есть официальный образец кода для того, что вы пытаетесь сделать. Он иллюстрирует, как настроить функцию HTTPS для запроса заголовка авторизации с токеном, который клиент получил во время аутентификации. Функция использует библиотеку firebase-admin для проверки токена.
Кроме того, вы можете использовать « вызываемые функции », чтобы упростить большую часть этого шаблона, если ваше приложение может использовать клиентские библиотеки Firebase.
источник
Как упоминал @Doug, вы можете использовать
firebase-admin
для проверки токена. Я привел быстрый пример:В приведенном выше примере я также включил CORS, но это необязательно. Сначала вы получаете
Authorization
заголовок и выясняете, чтоtoken
.Затем вы можете использовать
firebase-admin
этот токен для проверки. Вы получите декодированную информацию для этого пользователя в ответе. В противном случае, если токен недействителен, будет выдана ошибка.источник
getIdToken()
метод на стороне клиента (напримерfirebase.auth().currentUser.getIdToken().then(token => console.log(token))
) в документации firebaseКак также упомянул @Doug, вы можете использовать вызываемые функции , чтобы исключить некоторый шаблонный код из вашего клиента и вашего сервера.
Вызываемая функция Exampale:
Его можно вызвать прямо из вашего клиента следующим образом:
источник
Вышеупомянутые методы аутентифицируют пользователя с помощью логики внутри функции, поэтому функция должна быть вызвана для выполнения проверки.
Это отличный метод, но для наглядности есть альтернатива:
Вы можете сделать функцию «частной», чтобы ее могли вызывать только зарегистрированные пользователи (разрешения выбираете вы). В этом случае неаутентифицированные запросы отклоняются вне контекста функции, и функция вообще не вызывается.
Здесь приведены ссылки на (а) настройку функций как общедоступных / частных , а затем (б) аутентификацию конечных пользователей для ваших функций .
Обратите внимание, что приведенные выше документы относятся к Google Cloud Platform, и это действительно работает, потому что каждый проект Firebase также является проектом GCP. Связанное с этим методом предостережение заключается в том, что на момент написания он работает только с аутентификацией на основе учетной записи Google.
источник
Есть хороший официальный пример использования Express, который может пригодиться в будущем: https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js (вставлено ниже только для уверенности)
Имейте в виду, что это
exports.app
делает ваши функции доступными через/app
slug (в этом случае есть только одна функция, доступная под<you-firebase-app>/app/hello
. Чтобы избавиться от нее, вам действительно нужно немного переписать часть Express (часть промежуточного программного обеспечения для проверки остается прежней - она работает очень хорошо и вполне понятно благодаря комментариям).Мое переписывание, чтобы избавиться от
/app
:источник
Я изо всех сил пытался получить правильную аутентификацию firebase в функции golang GCP. На самом деле для этого нет примера, поэтому я решил создать эту крошечную библиотеку: https://github.com/Jblew/go-firebase-auth-in-gcp-functions
Теперь вы можете легко аутентифицировать пользователей с помощью firebase-auth (который отличается от gcp-authenticated-functions и не поддерживается напрямую прокси-сервером с идентификацией).
Вот пример использования утилиты:
Просто не забудьте развернуть свою функцию с
--allow-unauthenticated
флагом (поскольку аутентификация firebase происходит внутри выполнения функции).Надеюсь, это поможет вам, как и мне. Я решил использовать golang для облачных функций по соображениям производительности - Jędrzej
источник
В Firebase для упрощения вашего кода и вашей работы это всего лишь вопрос архитектурного дизайна :
Express
. Чтобы ограничить только тот же сайт или только определенный сайт , используйтеCORS
для управления этим аспектом безопасности. Это имеет смысл, потому чтоExpress
это полезно для SEO из-за рендеринга контента на стороне сервера.context
параметр, чтобы избавиться от неприятностей. Это также имеет смысл, потому что, например, одностраничное приложение, созданное с помощью AngularJS - AngularJS плох для SEO, но, поскольку это приложение, защищенное паролем, вам также не нужно много SEO. Что касается шаблонов, AngularJS имеет встроенные шаблоны, поэтому нет необходимости в отдельных шаблонах сExpress
. Тогда вызываемых функций Firebase должно быть достаточно.С учетом вышесказанного, больше никаких хлопот и облегчение жизни.
источник