生命短暂,如果有一件事我没有时间做的话,那就是为我的全栈项目配置一个集成的认证和数据库系统。当我开始一个项目时,我想直接开始构建,而不是花几个小时阅读文档和配置我的新代码库使其工作。好吧,这一切都将在这里结束。
让这个指南成为从天堂来的认证 + 数据库速成,让你的想法尽快启动,从今天开始。我们将使用React.js在前端开发这个全栈系统,尽管这个过程对于Next.js应用程序也是类似的,并且使用Firebase作为后端,因为它们处理所有繁重的逻辑工作,并且对于认证和Firestore NoSQL数据库都有一个了不起的免费层。你可以今天免费部署你的项目,并且在你开始赚大钱之前不会产生任何费用!
首先,我们从使用Vite创建一个React.js项目开始。这是一个基本的过程;你只需要在终端中运行以下命令!
npm create vite@latest my-fullstack-react-app -- --template react
哇,这太容易了。现在我们可以打开我们的项目并在代码编辑器中进行编辑!
接下来的任务是创建以下文件:
-
/firebase.js
-
/src/context/AuthContext.jsx
-
/.env
-
/src/components/Login.jsx
-
/src/components/Dashboard.jsx
**firebase.js
**文件可以包含以下代码:
import {initializeApp} from 'firebase/app'
import {getAuth} from 'firebase/auth'
import {getFirestore} from 'firebase/firestore'
// Your web app's Firebase configuration
const firebaseConfig = {
apiKey: import.meta.env.VITE_APIKEY,
authDomain: import.meta.env.VITE_AUTHDOMAIN,
projectId: import.meta.env.VITE_PROJECTID,
storageBucket: import.meta.env.VITE_STORAGEBUCKET,
messagingSenderId: import.meta.env.VITE_MESSAGINGSENDERID,
appId: import.meta.env.VITE_APPID
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
export const auth = getAuth(app)
export const db = getFirestore(app)
这段代码在我们的React.js代码库中初始化Firebase,并初始化并导出我们的Firebase认证和数据库,以便在项目的其他地方可以访问它们。
**AuthContext.jsx
**组件稍微复杂一些:
import React, { useContext, useState, useEffect } from 'react'
import { auth, db } from '../../firebase'
import { signInWithEmailAndPassword, createUserWithEmailAndPassword, signOut, onAuthStateChanged } from 'firebase/auth'
const AuthContext = React.createContext()
export function useAuth() {
// 创建一个useAuth hook,以便在整个应用程序中访问上下文
return useContext(AuthContext)
}
export function AuthProvider({ children }) {
// 为我们的应用程序创建认证包装器组件
// 可以选择定义一个userData状态并添加到上下文中
const [currentUser, setCurrentUser] = useState(null)
function signup(email, password) {
return createUserWithEmailAndPassword(auth, email, password)
}
function login(email, password) {
return signInWithEmailAndPassword(auth, email, password)
}
function logout() {
return signOut(auth)
}
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, user => {
// 这里可以从Firebase获取通用用户数据
setCurrentUser(user)
})
return unsubscribe
}, [])
const value = {
currentUser,
signup,
logout,
login
}
return (
<AuthContext.Provider value={value}>
{children}
</AuthContext.Provider>
)
}
这个组件有两个函数,一个创建一个认证钩子,我们可以使用它来在整个应用程序中访问认证状态,第二个是一个认证包装器组件,我们将用它来封装整个应用程序。
我们还定义了一些逻辑来监视认证状态,以便我们的应用程序对用户的不同认证状态做出响应。我们定义了三个函数来演示主要的认证方法,但是可以创建更多类似的函数。最后,我们将认证状态和方法作为上下文传递给整个应用程序,允许它们在任何组件中访问。
用户的登录状态巧妙地存储在cookie中,因此即使页面刷新,认证状态也可以在一段时间内保持,而无需用户再次登录!
为了保护我们的应用程序安全,我们将密钥保存在一个**.env
**文件中。可以按照以下方式初始化该文件:
VITE_APIKEY=
VITE_AUTHDOMAIN=
VITE_PROJECTID=
VITE_STORAGEBUCKET=
VITE_MESSAGINGSENDERID=
VITE_APPID=
我们将很快在这里填写实际的密钥值,然后在firebase.js
文件中访问它们。
现在,我们需要初始化一个登录组件来处理用户的注册和登录功能:
import React, { useState } from 'react'
import { useAuth } from '../context/AuthContext'
export default function Login() {
const [createAccount, setCreateAccount] = useState(false)
const [userCreds, setUserCreds] = useState({ email: '', password: '' })
const { signUp, login } = useAuth()
function updateEmail(e) {
setUserCreds({ ...userCreds, email: e.target.value })
}
function updatePassword(e) {
setUserCreds({ ...userCreds, password: e.target.value })
}
function handleSubmit(e) {
e.preventDefault()
// 如果表单未完成,则阻止注册
if (!userCreds.email || !userCreds.password) { return }
if (createAccount) {
// 建议在此处添加密码正则表达式检查
console.log('注册中')
signUp(userCreds.email, userCreds.password)
} else {
console.log('登录中')
login(userCreds.email, userCreds.password)
}
}
return (
<div>
<input placeholder='电子邮件' value={userCreds.email} onChange={(e) => {
updateEmail(e)
}}></input>
<input placeholder='密码' type='password' value={userCreds.password} onChange={(e) => {
updatePassword(e)
}}></input>
<button onClick={handleSubmit}>
<p>提交</p>
</button>
<button onClick={() => setCreateAccount(!createAccount)}>
<p>{createAccount ? '登录' : '注册'}</p>
</button>
</div>
)
}
我们巧妙地通过调用useContext()
钩子并从中解构方法来访问这两个方法!在组件的JSX中,我们创建了两个输入字段,分别用于电子邮件和密码,一个用于提交表单的按钮,一个用于在注册和登录状态之间切换的按钮。
最后,我们可以为已登录的用户显示一个仪表板组件 :P
import React from 'react'
import { doc, increment, serverTimestamp, setDoc } from "firebase/firestore";
import { useAuth } from '../context/AuthContext'
import { db } from '../../firebase';
export default function Dashboard() {
const { logout, currentUser } = useAuth()
async function handleIncrement() {
const userRef = doc(db, 'users', currentUser.uid);
await setDoc(userRef, { counter: increment(1), timestamp: serverTimestamp() }, { merge: true });
}
return (
<div>
<p> 你好世界,欢迎来到仪表板</p>
<button onClick={handleIncrement}>增加数据库</button>
<button onClick={logout}>登出</button>
</div>
)
}
仪表板还有一个增加计数器,以演示我们如何通过将用户ID与数据库连接起来,修改特定于用户的信息。此外,它还包含一个用于用户希望从他们的帐户注销的注销函数。
你可以在这里阅读有关使用Firebase/Firestore进行CRUD操作的更多信息:
有了所有的组件和文件创建好了,我们可以快速修改我们的**app.jsx
**组件,以便在未经身份验证的用户上呈现登录组件,并在已登录的用户上呈现仪表板组件。
import { useAuth } from './context/AuthContext'
import Login from './components/Login'
import Dashboard from './components/Dashboard'
function App() {
const { currentUser } = useAuth()
return (
<div>
{currentUser ? (
<Dashboard />
) : (
<Login />
)}
</div>
)
}
export default App
这个非常简单的app组件使用auth上下文访问currentUser状态,并根据是否找到用户来有条件地呈现我们的仪表板或登录组件!
最后,我们可以提供一些Firebase资源来管理我们的认证和数据库工具在云端(更不用说它对于一定量的使用是免费的)!
如果我们访问以下页面并点击开始,我们将进入我们的开发者控制台:
从这里,我们将点击添加项目,给我们的项目命名,可以选择使用Google Analytics,最后进入到我们新项目的仪表板。它应该看起来像这样!
现在我们可以按照以下步骤完成设置:
- 首先,我们要选择身份验证。
-
在接下来的页面上点击开始。
-
选择_Email/Password_以启用使用电子邮件和密码进行身份验证。
- 启用_Email/Password_并点击保存。
这样就完成了Firebase身份验证的配置。现在我们初始化数据库!
- 从主页仪表盘中选择Cloud Firestore。
- 在这里我们将创建一个数据库。唯一需要考虑的是如果您非常关注延迟,可以选择您的位置数据库,然后点击下一步。
- 现在我们将数据库设置为测试模式,以确保读取和写入选项是开放的。
- 现在,回到仪表盘,为我们的Firebase项目配置Web应用程序。选择Web选项。
- 在这里,创建一个应用程序名称,然后点击注册应用程序。
- 最后,您将被引导到配置屏幕,其中将向您提供所有宝贵的密钥,以便插入到React代码库的
.env
文件中。
现在我们可以将所需的密钥输入到我们的.env
文件中,使其如下所示:
VITE_APIKEY=AIzaSyA3uUJXfR1241241KvUZWi3QnuUel3Y_euSnyg
VITE_AUTHDOMAIN=test123–22ba3.firebaseapp.com
VITE_PROJECTID=test123–22ba3
VITE_STORAGEBUCKET=test123–22ba3.appspot.com
VITE_MESSAGINGSENDERID=176123123817312
VITE_APPID=1:176123123817312:web:89asdklj8123klj8asdf6623c4ffc5
对于任何机会主义者,很抱歉,该项目已被删除,这将使这些密钥无效 :P
最后,我们的项目已准备就绪。我们可以使用以下终端命令运行我们的应用程序:
npm run dev
然后在http://localhost:5173
上启动它!
从那里,您应该能够注册一个帐户,一旦登录,点击增加按钮。要确认您的应用程序是否正常工作,请检查Firebase主页上的Firestore控制台,您应该看到您的用户数据随着时间戳的增加而增加。
就是这样!恭喜您完成了React.js + Firebase身份验证和数据库的速成课程。愿您的全栈项目安全并管理大量用户数据 :P