Как защитить Firebase Cloud Function HTTP-конечную точку, чтобы разрешать только проверенные пользователями Firebase?
С новой облачной функцией firebase я решил перенести часть моей конечной точки HTTP на firebase.
Все отлично работает... Но у меня есть следующая проблема. У меня есть две конечные точки, созданные HTTP-триггерами (облачные функции)
- Конечная точка API для создания пользователей и возврата пользовательского токена
созданный Firebase Admin SDK.
- Конечная точка API для получения определенных сведений о пользователе.
В то время как первая конечная точка в порядке, но для моей второй конечной точки я хотел бы защитить ее только для аутентифицированных пользователей. что означает тот, у кого есть токен, сгенерированный ранее.
Как мне решить это?
Я знаю, что мы можем получить параметры заголовка в облачной функции, используя
request.get('x-myheader')
но есть ли способ защитить конечную точку так же, как защитить базу данных в реальном времени?
Ответы
Ответ 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));