Я сделал веб-сайт для своей школы, но пытаюсь его расширить. Это не так безопасно с аутентификацией и тому подобным, поэтому я создаю сервер для входа пользователей, а затем, когда они захотят обновить свои настройки на веб-сайте, он отправит запрос на сервер, чтобы сделать это.
В настоящее время я пытаюсь работать над входом пользователя в систему. Когда я перехожу по маршруту «/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.
Я не совсем понимаю, почему вы ожидаете, что эта система будет работать, но, похоже, вы упускаете одну важную деталь: Firebase Admin SDK может проверять токены пользователей только для учетных записей пользователей, созданных с помощью Firebase Authentication. Что бы вы ни делали с google.auth.OAuth2
для конечных пользователей, это просто несовместимо с Firebase.
Если вы хотите войти в систему пользователя с помощью его учетной записи Google способом, совместимым с аутентификацией Firebase, есть специальные инструкции для того, чтобы сделать это полностью в коде внешнего интерфейса. Как только пользователь войдет в систему с помощью Google и у него будет учетная запись пользователя Firebase Auth, связанная с этой учетной записью Google, только тогда вы сможете проверить токен идентификатора пользователя с помощью Firebase Admin SDK (при условии, что ваш интерфейс передает токен идентификатора пользователя в запрос.