Аутентификация Firebase в основном выполняется во внешнем интерфейсе
Правильно.Аутентификация пользователя полностью выполняется на стороне клиента при использовании предоставленных SDK от Firebase.
Однако, если вам нужно выполнить какую-то специальную аутентификацию, такую как интеграция с LDAP / AD или некоторыми другими корпоративными махинациями, вам потребуется создать пользовательский токен , которые клиентские SDK будут использовать для аутентификации пользователя.
Как мне заставить req.user
работать с Firebase в бэкэнде?
Это то, что вам понадобится реализовать самостоятельно.Поток на стороне клиента будет выглядеть примерно так:
- Пользователь выполняет аутентификацию на стороне клиента.
- Когда пользователь пытается получить доступ к вашему Express API, вам нужно будет получить токен из
localstorage
и отправить его вместе с запросом API.,
Предположим, вы прикрепили токен к заголовку запроса: FIREBASE_AUTH_TOKEN: abc
.См. Firebase для извлечения пользовательских данных, хранящихся в локальном хранилище, как firebase: authUser:
Так что на стороне сервера, используя Firebase Admin SDK , вы получите этот токени проверьте это с помощью verifyIdToken
.Ниже приведен краткий пример использования промежуточного программного обеспечения:
const {auth} = require('firebase-admin');
const authService = auth();
exports.requiresAuth = async (req, res, next) => {
const idToken = req.header('FIREBASE_AUTH_TOKEN');
// https://firebase.google.com/docs/reference/admin/node/admin.auth.DecodedIdToken
let decodedIdToken;
try {
decodedIdToken = await authService.verifyIdToken(idToken);
} catch (error) {
next(error);
return;
}
req.user = decodedIdToken;
next();
}
Затем вы должны использовать это промежуточное программное обеспечение следующим образом:
const express = require('express');
const router = express.Router();
const {requiresLogin} = require('./my-middleware.js');
router.get('/example', requiresLogin, async (req, res) => {
console.log(req.user)
})
Надеюсь, это даст вам представление о том, что делать.Я некоторое время не работал с Firebase, и информацию, приведенную выше, я получил, просмотрев документацию.