Подтвердить что ты не робот

Как защитить Firebase Cloud Function HTTP-конечную точку, чтобы разрешать только проверенные пользователями Firebase?

С новой облачной функцией firebase я решил перенести часть моей конечной точки HTTP на firebase. Все отлично работает... Но у меня есть следующая проблема. У меня есть две конечные точки, созданные HTTP-триггерами (облачные функции)

  • Конечная точка API для создания пользователей и возврата пользовательского токена созданный Firebase Admin SDK.
  • Конечная точка API для получения определенных сведений о пользователе.

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

Как мне решить это?

Я знаю, что мы можем получить параметры заголовка в облачной функции, используя

request.get('x-myheader')

но есть ли способ защитить конечную точку так же, как защитить базу данных в реальном времени?

4b9b3361

Ответ 1

Существует официальный пример кода того, что вы пытаетесь сделать. Это иллюстрирует, как настроить функцию HTTPS для запроса заголовка авторизации с токеном, который клиент получил во время аутентификации. Функция использует библиотеку firebase-admin для проверки токена.

Кроме того, вы можете использовать " вызываемые функции ", чтобы упростить многие из этих шаблонов, если ваше приложение может использовать клиентские библиотеки Firebase.

Ответ 2

Как уже упоминалось @Doug, вы можете использовать firebase-admin для проверки токена. Я установил быстрый пример:

exports.auth = functions.https.onRequest((req, res) => {
  cors(req, res, () => {
    const tokenId = req.get('Authorization').split('Bearer ')[1];

    return admin.auth().verifyIdToken(tokenId)
      .then((decoded) => res.status(200).send(decoded))
      .catch((err) => res.status(401).send(err));
  });
});

В приведенном выше примере я также включил CORS, но это необязательно. Сначала вы получаете заголовок Authorization и узнаете token.

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

Надеюсь, это поможет.

Ответ 3

Как уже упоминалось @Doug, вы можете использовать Callable Functions, чтобы исключить некоторый шаблонный код из вашего клиента и вашего сервера.

Вызываемая функция Exampale:

export const getData = functions.https.onCall((data, context) => {
  // verify Firebase Auth ID token
  if (!context.auth) {
    return { message: 'Authentication Required!', code: 401 };
  }

  // do your things..
  const uid = context.auth.uid;
  const query = data.query;

  return { message: 'Some Data', code: 400 };
});

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

firebase.functions().httpsCallable('getData')({query}).then(result => console.log(result));