Я использую конечные точки Google в качестве шлюза API, который работает в службе контейнеров Google Run. Путь API указывает на функцию Google (node js). Вызовы к шлюзу API поступают из веб-приложения (а именно из браузера).
Один из путей: /login
, который аутентифицирует пользователя в firebase с использованием метода firebase.auth().signInWithEmailAndPassword
. Я получаю идентификатор токена пользователя и отправляю его обратно в заголовок ответа (аутентификационный носитель) обратно в браузер. Это работает, как и ожидалось.
Когда выполняются другие запросы (например, /check
) к конечной точке, токен (в заголовке) включается. Я хотел проверить правильность токена с помощью метода Firebase Admin перед обработкой любых запросов. Код в функции Google, который делает это для одного из маршрутов, выглядит следующим образом:
...
const decodeIdToken = async (req, res, next) => {
// Read the ID Token from the Authorization header.
const idToken = req.headers.authorization.split('Bearer ')[1];
try {
const decodedIdToken = await admin.auth().verifyIdToken(idToken);
req.decodedToken = decodedIdToken;
next();
return;
} catch (error) {
return res.status(403).json({
status: 'failure',
data: null,
error: error.message
});
}
};
// use decodeIdToken as middleware
app.post('/check', decodeIdToken, (req, res, next) => {
return res.json({
status: 'success',
data: req.decodedToken,
error: null
});
});
Когда я вызываю (через Почтальон) маршруты, напрямую вызывая триггер функции Google оба маршрута работа. Однако когда я вызываю конечные точки Google , которые указывают на функцию Google, я получаю следующую ошибку при использовании объекта администратора Firebase:
Маркер Firebase ID имеет неверный \ "aud \" "(аудитория) претензия. Ожидаемый \ "PROJECT-ID \", но получил \ "https://us-central1-PROJECT-ID.cloudfunctions.net/FUNCTION-NAME \". Убедитесь, что маркер ID происходит из того же проекта Firebase, что и учетная запись службы, используемая для аутентификации этого SDK. См. https://firebase.google.com/docs/auth/admin/verify-id-tokens для получения подробной информации о том, как получить идентификатор токена
При настройке объекта администратора Firebase в NodeJs я попытался сделать следующее:
const admin = require('firebase-admin');
admin.initializeApp();
а также
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://PROJECT-ID.firebaseio.com"
});