代码之家  ›  专栏  ›  技术社区  ›  Grantie

Firebase说ID不匹配

  •  0
  • Grantie  · 技术社区  · 2 年前

    我已经为我的学校制作了一个网站,但我正在努力扩展它。使用身份验证等方法不太安全,所以我正在制作一个服务器供用户登录,然后当他们想更新网站上的设置时,它会向服务器发送请求。

    我目前正在尝试用户登录。当我转到“/login”路径时,它会将我带到谷歌登录页面。我登录后,它会将我带到“/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'
    }
    

    我也希望得到一些帮助,在错误解决后,我将能够继续在我的网站上开发这个登录系统。以下是我的代码文件:

    server.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.log(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.log(`Listening on port ${PORT}`);
    });
    

    我很感激能得到的任何帮助&书信电报;3.

    我试过用Firebase ID更改server.js中的客户端ID,但这只会导致更多错误。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Doug Stevenson    2 年前

    我不完全确定你为什么期望这个系统工作,但你似乎错过了一个重要的细节:Firebase Admin SDK只能验证由Firebase Authentication创建的用户帐户的用户令牌。无论你在做什么 google.auth.OAuth2 对于最终用户来说,它与Firebase不兼容。

    如果你想以与Firebase身份验证兼容的方式使用谷歌帐户登录用户,有 special instructions 感谢您完全在前端代码中做到这一点。用户登录谷歌后 有一个Firebase Auth用户帐户链接到该谷歌帐户,只有这样你才能 verify the user's ID 令牌(假设您的前端在请求中传递用户ID令牌)。

    推荐文章