Firebase говорит, что идентификатор не соответствует

Я сделал веб-сайт для своей школы, но пытаюсь его расширить. Это не так безопасно с аутентификацией и тому подобным, поэтому я создаю сервер для входа пользователей, а затем, когда они захотят обновить свои настройки на веб-сайте, он отправит запрос на сервер, чтобы сделать это.

В настоящее время я пытаюсь работать над входом пользователя в систему. Когда я перехожу по маршруту «/login», я попадаю на страницу входа в Google. Я вхожу в систему, и это приводит меня к маршруту «/app». В консоли я получаю журнал ниже.

FirebaseAuthError: Firebase ID token has incorrect "aud" (audience) claim. Expected "school-progress-g" but got "1090170234957-5ntr48jf178o9befpp5n0603hoh7m2rh.apps.googleusercontent.com". Make sure the ID token comes from the same Firebase project as the service account used to authenticate this SDK. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.
    at FirebaseTokenVerifier.verifyContent (/rbd/pnpm-volume/124c6272-9622-4f1d-925a-072a4f9e9ad7/node_modules/firebase-admin/lib/auth/token-verifier.js:239:19)
    at /rbd/pnpm-volume/124c6272-9622-4f1d-925a-072a4f9e9ad7/node_modules/firebase-admin/lib/auth/token-verifier.js:160:18 {
  errorInfo: {
    code: 'auth/argument-error',
    message: 'Firebase ID token has incorrect "aud" (audience) claim. Expected "school-progress-g" but got "1090170234957-5ntr48jf178o9befpp5n0603hoh7m2rh.apps.googleusercontent.com". Make sure the ID token comes from the same Firebase project as the service account used to authenticate this SDK. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.'
  },
  codePrefix: 'auth'
}

Я также был бы признателен за помощь в том, как я смогу продолжить разработку этой системы входа на свой веб-сайт после устранения ошибки. Вот мои файлы кода:

сервер.js

const cookieParser = require("cookie-parser");
const express = require("express");
const admin = require("firebase-admin");

const serviceAccount = require("./serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://school-progress-g-default-rtdb.firebaseio.com",
});

const PORT = process.env.PORT || 3000;
const app = express();

app.engine("html", require("ejs").renderFile);
app.use(express.static("static"));

app.use(cookieParser());

const firebaseAuthMiddleware = (req, res, next) => {
  const idToken = req.cookies.idToken || "";
  
  if (idToken == "") {
    return next();
  }

  admin
    .auth()
    .verifyIdToken(idToken)
    .then((decodedToken) => {
      req.user = decodedToken;
      next();
    })
    .catch((error) => {
      console.info(error);
      next();
    });
};
app.use(firebaseAuthMiddleware);

const { google } = require("googleapis");

const oauth2Client = new google.auth.OAuth2(
  "1090170234957-5ntr48jf178o9befpp5n0603hoh7m2rh.apps.googleusercontent.com",
  "XXXXXXXX (censored)",
  "https://scpr-server-version.glitch.me/callback"
);

app.get("/login", (req, res) => {
  const authUrl = oauth2Client.generateAuthUrl({
    access_type: "offline",
    scope: ["https://www.googleapis.com/auth/userinfo.email"],
  });
  res.redirect(authUrl);
});

app.get("/callback", async (req, res) => {
  const { tokens } = await oauth2Client.getToken(req.query.code);
  res.cookie("idToken", tokens.id_token);
  res.render("app.html");
  return false;
  res.redirect("/app");
});

app.get("/logout", (req, res) => {
  res.clearCookie("idToken");
  res.redirect("/login");
});

app.get("/app", (req, res) => {
  if (req.user) {
    res.render("app.html");
  } else {
    res.redirect("/login");
  }
});

app.listen(PORT, () => {
  console.info(`Listening on port ${PORT}`);
});

Я ценю любую помощь, которую могу получить! <3

Я пробовал изменить идентификатор клиента в server.js на свой идентификатор Firebase, но это вызывает больше ошибок.

🤔 А знаете ли вы, что...
JavaScript имеет множество встроенных объектов, таких как Array, Date и Math.


56
1

Ответ:

Решено

Я не совсем понимаю, почему вы ожидаете, что эта система будет работать, но, похоже, вы упускаете одну важную деталь: Firebase Admin SDK может проверять токены пользователей только для учетных записей пользователей, созданных с помощью Firebase Authentication. Что бы вы ни делали с google.auth.OAuth2 для конечных пользователей, это просто несовместимо с Firebase.

Если вы хотите войти в систему пользователя с помощью его учетной записи Google способом, совместимым с аутентификацией Firebase, есть специальные инструкции для того, чтобы сделать это полностью в коде внешнего интерфейса. Как только пользователь войдет в систему с помощью Google и у него будет учетная запись пользователя Firebase Auth, связанная с этой учетной записью Google, только тогда вы сможете проверить токен идентификатора пользователя с помощью Firebase Admin SDK (при условии, что ваш интерфейс передает токен идентификатора пользователя в запрос.