首页
开发技巧正文内容

认证 + 数据库速成 [React.js & Firebase]

2024年01月27日
阅读时长 2 分钟
阅读量 7
认证 + 数据库速成 [React.js & Firebase]

生命短暂,如果有一件事我没有时间做的话,那就是为我的全栈项目配置一个集成的认证和数据库系统。当我开始一个项目时,我想直接开始构建,而不是花几个小时阅读文档和配置我的新代码库使其工作。好吧,这一切都将在这里结束。

让这个指南成为从天堂来的认证 + 数据库速成,让你的想法尽快启动,从今天开始。我们将使用React.js在前端开发这个全栈系统,尽管这个过程对于Next.js应用程序也是类似的,并且使用Firebase作为后端,因为它们处理所有繁重的逻辑工作,并且对于认证和Firestore NoSQL数据库都有一个了不起的免费层。你可以今天免费部署你的项目,并且在你开始赚大钱之前不会产生任何费用!

第一章 - 项目初始化

首先,我们从使用Vite创建一个React.js项目开始。这是一个基本的过程;你只需要在终端中运行以下命令!

npm create vite@latest my-fullstack-react-app -- --template react

哇,这太容易了。现在我们可以打开我们的项目并在代码编辑器中进行编辑!

接下来的任务是创建以下文件:

  1. /firebase.js

  2. /src/context/AuthContext.jsx

  3. /.env

  4. /src/components/Login.jsx

  5. /src/components/Dashboard.jsx

1.0 Firebase.js

**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认证和数据库,以便在项目的其他地方可以访问它们。

2.0 AuthContext.jsx

**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中,因此即使页面刷新,认证状态也可以在一段时间内保持,而无需用户再次登录!

3.0 环境变量

为了保护我们的应用程序安全,我们将密钥保存在一个**.env**文件中。可以按照以下方式初始化该文件:

VITE_APIKEY=
VITE_AUTHDOMAIN=
VITE_PROJECTID=
VITE_STORAGEBUCKET=
VITE_MESSAGINGSENDERID=
VITE_APPID=

我们将很快在这里填写实际的密钥值,然后在firebase.js文件中访问它们。

4.0 Login.jsx

现在,我们需要初始化一个登录组件来处理用户的注册登录功能:

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中,我们创建了两个输入字段,分别用于电子邮件和密码,一个用于提交表单的按钮,一个用于在注册和登录状态之间切换的按钮。

5.0 Dashboard.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

有了所有的组件和文件创建好了,我们可以快速修改我们的**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

最后,我们可以提供一些Firebase资源来管理我们的认证和数据库工具在云端(更不用说它对于一定量的使用是免费的)!

如果我们访问以下页面并点击开始,我们将进入我们的开发者控制台:

从这里,我们将点击添加项目,给我们的项目命名,可以选择使用Google Analytics,最后进入到我们新项目的仪表板。它应该看起来像这样!

Firebase项目仪表板现在我们可以按照以下步骤完成设置:

  1. 首先,我们要选择身份验证

选择身份验证!

  1. 在接下来的页面上点击开始

  2. 选择_Email/Password_以启用使用电子邮件和密码进行身份验证。

选择电子邮件/密码

  1. 启用_Email/Password_并点击保存

启用电子邮件/密码

这样就完成了Firebase身份验证的配置。现在我们初始化数据库!

  1. 从主页仪表盘中选择Cloud Firestore

返回主页然后选择Cloud Firestore

  1. 在这里我们将创建一个数据库。唯一需要考虑的是如果您非常关注延迟,可以选择您的位置数据库,然后点击下一步

可选择更新位置

  1. 现在我们将数据库设置为测试模式,以确保读取和写入选项是开放的。

在测试模式下启动数据库

  1. 现在,回到仪表盘,为我们的Firebase项目配置Web应用程序。选择Web选项。

返回主页然后启用Firebase Web应用程序

  1. 在这里,创建一个应用程序名称,然后点击注册应用程序

为您的Web应用程序命名

  1. 最后,您将被引导到配置屏幕,其中将向您提供所有宝贵的密钥,以便插入到React代码库的.env文件中。

将密钥输入到.env文件中

第4章 - 更新您的.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

第5章 - 运行您的应用程序

最后,我们的项目已准备就绪。我们可以使用以下终端命令运行我们的应用程序:

npm run dev

然后在http://localhost:5173上启动它!

从那里,您应该能够注册一个帐户,一旦登录,点击增加按钮。要确认您的应用程序是否正常工作,请检查Firebase主页上的Firestore控制台,您应该看到您的用户数据随着时间戳的增加而增加。

就是这样!恭喜您完成了React.js + Firebase身份验证和数据库的速成课程。愿您的全栈项目安全并管理大量用户数据 :P

免责声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

相关文章

探索多种软件架构模式及其实用应用
2024年11月22日19:06
本文深入探讨了多种软件架构模式,包括有界上下文、边车模式、发布-订阅模式、应用网关、微服务、命令职责分离(CQRS)等,介绍了它们的优点、使用场景以及具体应用实例。文章强调根据具体项目需求和团队能力选择最合适的架构,以构建高效和可维护的解决方案,同时展示了各架构模式间的综合应用,提供了丰富的案例和技术细节。
15个高级Python快捷键助您更快编程
2024年11月21日07:02
本文分享了 15 个高级的 Python 编程快捷键,包括上下文管理器、行内字典合并、函数参数解包、链式比较、dataclasses、海象运算符、反转列表、备忘录缓存、splitlines、enumerate、字典推导、zip 用于并行迭代、itertools.chain 扁平化列表、functools.partial 部分函数和 os.path 文件路径管理等,帮助开发者提高编程效率和代码简洁性。
揭示网页开发的 11 个迷思:停止相信这些误区
2024年11月19日22:05
网页开发充满误解,这篇博文针对11个常见迷思进行揭秘。包括网站开发后不需更新、需掌握所有技术、AI会取代开发者等。强调持续学习、专业化、用户体验的重要性,澄清误区如多任务处理的必要性和最新技术的必需性。文章提醒开发者注重实用而非追求完美代码,以务实态度面对开发工作。
你知道 CSS 的四种 Focus 样式吗?
2024年11月18日21:41
本文介绍了四种 CSS focus 样式::focus、:focus-visible、:focus-within 以及自定义的 :focus-visible-within,帮助提升网站用户体验。:focus 样式应用于被选中元素;:focus-visible 仅在键盘导航时显示;:focus-within 用于父元素;自定义 :focus-visible-within 结合两者效果。合理运用这些样式能使网站更方便键盘用户导航。
利用 Python 实现自动化图像裁剪:简单高效的工作流程
2024年11月11日20:49
使用 Python 和 OpenCV 自动裁剪图像,轻松实现 16:9 的完美构图。这个指南介绍了如何通过代码进行灰度化、模糊处理和边缘检测,最终识别出最重要的部分进行裁剪。特别适合需要批量处理图像的情况,节省大量时间。
每位资深前端开发人员都应了解的 TypeScript 高级概念
2024年11月11日02:07
资深前端开发者应了解 TypeScript 的高级概念,如联合类型、交叉类型、类型保护、条件类型、映射类型、模板字面量类型和递归类型。这些特性可提升代码的可维护性和可扩展性,确保在开发复杂应用时实现更高的类型安全性和效率。