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

尝试获取firebase身份验证时出错。无法读取未定义的属性(正在读取“getProvider”)

  •  0
  • MattJ  · 技术社区  · 1 年前

    我正试图使用firebase的getAuth()命令在firebase中创建一个用户。当我启动Node.js服务器端代码时,我收到一个错误:

    TypeError: Cannot read properties of undefined (reading 'getProvider') at Object._getProvider (/Users/mnjuhn/Projects/CloudMedic/src/routes/functions/node_modules/@firebase/app/dist/index.cjs.js:276:10)
        at getAuth (/Users/mnjuhn/Projects/CloudMedic/src/routes/functions/node_modules/@firebase/auth/dist/node/totp-fe65684a.js:8197:24)
        at Object.<anonymous> (/Users/mnjuhn/Projects/CloudMedic/src/routes/functions/app.js:26:14)
        at Module._compile (node:internal/modules/cjs/loader:1376:14)
        at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
        at Module.load (node:internal/modules/cjs/loader:1207:32)
        at Module._load (node:internal/modules/cjs/loader:1023:12)
        at Module.require (node:internal/modules/cjs/loader:1235:19)
        at require (node:internal/modules/helpers:176:18)
        at Object.<anonymous> (/Users/mnjuhn/Projects/CloudMedic/src/routes/functions/user.js:2:36)
    

    这是我的用户和firebase应用程序代码。

    var functions = require("firebase-functions");
    const { getDatabase, ref, set, child, push, update } = require("firebase/database");
    const { getAuth, onAuthStateChanged, signInWithEmailAndPassword, initializeAuth, createUserWithEmailAndPassword } = require("firebase/auth");
    const { doc, setDoc } = require('firebase/firestore');
    const { getFirestore, Timestamp, FieldValue, Filter } = require('firebase-admin/firestore');
    const { initializeApp } =  require('firebase-admin/app');
    const http = require('http');
    const express = require('express');
    var bodyParser = require('body-parser');
    var router = express.Router();
    var cors = require('cors');
    
    const firebaseConfig = {
      // hidden configuration code
    };
    
    const admin = initializeApp(firebaseConfig);
    const db = getFirestore(admin);
    const auth = getAuth(admin);
    
    const app = express();
    app.use(cors());
    
    app.use(bodyParser.json());
    app.use(bodyParser.json({limit:'5mb'}));
    app.use(bodyParser.urlencoded({extended:true}));
    var jsonParser = bodyParser.json();
    
    async function signIn(email, password) {
    
      signInWithEmailAndPassword(email, password).then((userCredential) => {
         // Signed in
         console.log("TEST Signed in");
         return userCredential;
       }).catch((error) => {
         const errorCode = error.code;
         const errorMessage = error.message;
         console.log("Error Signing in");
         console.log(error.message);
         throw error;
       });
    }
    
    exports.db = db;
    exports.app = app;
    exports.signIn = signIn;
    exports.admin = admin;
    exports.auth = auth;
    exports.createUserWithEmailAndPassword = createUserWithEmailAndPassword;
    

    这是我的创建用户代码。

    var constants = require('./constants.js');
    const { db, app, signIn, admin } = require('./app');
    var cors = require('cors');
    const { Timestamp } = require('firebase/firestore');
    
    function signup(req, res) {
        birthDate = new Date(Number(req.query.birthDate));
        var user = {
             id: db.collection("users").doc().id,
             email: req.query.email, 
             password: req.query.password,
             firstName: req.query.firstName,
             lastName: req.query.lastName,
             gender: req.query.gender,
             birthDate: birthDate,
             timestamp: new Date()
       };
    
        const auth = app.auth;
        app.createUserWithEmailAndPassword(auth, req.query.email, req.query.password).then((userCredential) => {
           // Signed up
           const user = userCredential.user;
           console.log("USER SUCCESSFULLY CREATED");
          }).catch((error) => {
            const errorCode = error.code;
            const errorMessage = error.message;
            console.log("ERROR CREATING USER");
            // ..
          });
    
          return db.collection('users').doc(user.id).set(user).then(snapshot => {
              console.log(user);
              return res.status(200).json({status:200, message:"ADDED USER"});
          }).catch(err => {
              console.log(err);
              return res.status(200).json({status:200, message:"ERROR ADDING USER"});
          });
    }
    
    module.exports = {
      signup: signup,
    };
    

    这个错误可能源于const-auth=getAuth(admin)行;是使用firebase管理的结果吗?

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

    这里有很多问题都需要纠正。我将在这里列出一些我可以立即看到的内容:

    1. 您将firebase管理与firebase web客户端库的使用混为一谈( firebase/auth ). 它们彼此不兼容。您不能将web客户端getAuth与使用Firebase Admin SDK初始化的应用程序一起使用( firebase-admin/app ).

    2. Firebase web客户端 firebase/auth 根本不打算在后端系统上使用。后端不支持使用登录 signInWithEmailAndPassword 。这只适用于网络前端。用户登录到前端应用程序,而不是后端应用程序。后端只响应通过身份验证的用户发出的请求,并通过请求中提供的令牌来标识它们。Firebase管理员 documentation 有一个例子。

    3. 这些导出对于与云函数一起使用毫无意义。您只需要导出单独的函数进行部署。

    exports.db = db;
    exports.signIn = signIn;
    exports.admin = admin;
    exports.auth = auth;
    exports.createUserWithEmailAndPassword = createUserWithEmailAndPassword;
    

    如果您使用的是快递应用程序,只需导出即可。我建议查看 documentation 更仔细地研究。你应该先让一个简单的快递应用程序工作,然后添加功能。

    推荐文章