我正在尝试在前端使用 Firebase 通过 SMS 验证用户,生成中间凭证,并将其与用户创建数据一起传递到后端进行验证。如果身份验证有效并且其他字段满足某些约束,我将创建用户。
但是,我似乎在初始化和导入 firebase 时遇到问题。当我尝试创建新用户时,它似乎正确生成了中间凭据并将其发送到后端。但是,当我尝试验证凭据时,我得到以下输出:
{ providerId: 'phone', verificationCode: '111111', verificationId: 'blah blah blah' }
Error registering user: TypeError: firebase.auth is not a function at registerUser
userController.js:
import * as firebase from 'firebase/app';
import User from '../models/User.js';
import generateToken from '../utils/generateToken.js';
...
const registerUser = async (req, res) =\> {
const { username, password, other fields, credential } = req.body;
try {
// validate other fields
console.log(credential);
const result = await firebase.auth().signInWithCredential(auth, credential);
console.log(result);
// create user
}
firebase.js:
const firebaseConfig = {
apiKey: "...",
authDomain: "....firebaseapp.com",
projectId: "...",
storageBucket: "....appspot.com",
messagingSenderId: "...",
appId: "...",
measurementId: "..."
};
import firebase from 'firebase/compat/app';
import "firebase/compat/auth";
firebase.initializeApp(firebaseConfig)
export const auth = firebase.auth();
我已将
"type": "module",
包含在我的后端的 package.json 文件中。
我知道我没有正确验证后端的凭据,但此时我真的只想能够运行 signInWithCredential 而不会出现错误。我将非常感谢任何帮助
我看到另一个 stackoverflow 线程说我应该尝试“firebase.deault.auth()”,但是 这会导致以下错误:“TypeError:无法读取未定义的属性(读取'auth')”
我最初使用的是导入语句,如“const express = require('express');”并遇到类似的错误,但现在我已将它们切换为这种样式“从‘express’导入快递;”并在我的后端文件中传播了适当的更改。但这似乎并没有解决任何问题。
到目前为止,我已经被这个问题困扰了好几天了。我已经尝试了很多我在网上看到的东西,但我实际上没有网络开发经验,所以我认为我可能只是犯了一些简单的错误。
Firebase 的 api 在 V9 中又变回了。
firebase.auth()
不再是获取 auth 对象的方法,而是这样完成的:
import { getAuth, signInWithCredential } from 'firebase/auth';
// ...
const result = await signInWithCredential(getAuth(), credential);
在您的 firebase.js 文件中,您似乎考虑到了这一点,因为您是从
firebase/compat
导入的。这允许您使用旧的 API,直到您可以将代码更新为新样式。如果您尚未准备好升级,您可以在 userController.js
文件中执行相同的操作:
import firebase from 'firebase/compat/app';
// ...
const result = await firebase.auth().signInWithCredential(credential);