检查点
Register your app
/ 30
Set up authentication
/ 35
Add a customer page to your web app
/ 35
使用 Firebase 构建无服务器 Web 应用
GSP643
概览
12 年前,Lily 创办了 Pet Theory 连锁宠物医院。近几年来,Pet Theory 宠物医院的规模迅速扩张。他们的旧预约系统无法处理日益增加的客流量,客户也无法自行预约,因此 Lily 请 IT 部门的 Patrick 和顾问 Ruby 构建一个易于扩缩的云端系统。在本实验中,您将构建一个功能齐全的 Firebase Web 应用,允许用户实时输入信息和安排预约。
架构
下图概述了您将使用的服务,以及这些服务之间的关系:
目标
在本实验中,您将学习如何完成以下操作:
- 配置 Firestore 安全功能以自动执行服务器端身份验证和授权。
- 向您的 Web 应用中添加 Google 登录功能。
- 配置数据库,以便用户可以添加他们的联系信息。
- 探索和部署允许用户自行安排预约的代码。
- 在您的 Web 应用中探索 Firebase 的实时更新。
前提条件
这是一个中级实验,假设您熟悉 Cloud 控制台和 shell 环境。具备 Firebase 使用经验会有帮助,但不是硬性要求。在进行本实验之前,建议您先完成以下实验:
您还应该能够自如地修改文件。您可以使用自己惯用的文本编辑器(如 nano
、vi
等),也可以从 Cloud Shell 顶部的功能区启动代码编辑器:
准备就绪后,请向下滚动页面,并按下方步骤来设置实验环境。
Firebase 后端
Ruby 给 Patrick 发送了一封电子邮件:
Ruby,软件顾问 |
Patrick,您好! 上周的工作完成得很出色。很高兴看到诊所的数据已迁移到 Firestore! 看来接下来的工作就是使用 Firebase 来托管 Pet Theory 网站。 Ruby |
Patrick,IT 管理员 |
Ruby,您好! 我没听说过 Firebase Hosting,它有什么优点?我应该如何着手? Patrick |
Ruby,软件顾问 |
Patrick,您好! Firebase Hosting 的主要优点是无服务器,因此我们无需管理基础设施。应用中还嵌入了安全规则,因此在处理客户数据时可以限制权限,最大限度地减少可能出现的问题。 它还具有“即用即付”模式,意味着 Firebase 这个综合性移动开发平台很适合我们的应用场景。 Ruby |
Patrick,IT 管理员 |
Ruby,您好! 听起来 Firebase 能大大简化安全和基础设施管理,这些在我的工作中占了很大一部分。不用为空闲服务器付费,也让我很期待! Patrick |
Ruby 通过电子邮件向 Patrick 发送一些背景信息,然后他们开了一次会来确定要执行的主要活动。在这次会议上,他们确定了 Ruby 需要完成以下任务:
- 配置 Firebase 项目。
- 制定安全政策。
- 将 Firestore CLI 添加到 Google Cloud 项目。
接下来,需要帮助 Patrick 完成以下任务。
任务 1.注册 Firebase 应用
打开无痕式窗口以访问 Firebase 控制台。
在系统提示时,输入以下信息:
- 用户名输入“
” - 密码输入“
”。
带有
在 Firebase 项目概览屏幕中,输入以下命令:
-
从“将 Firebase 添加至您的应用即可开始使用”图标列表中选择 Web 图标(在下图中突出显示):
-
在系统提示输入应用别名时,输入 Pet Theory。
Pet Theory -
选中“还为此应用设置 Firebase Hosting”。
-
点击“部署”下拉菜单,然后选择
创建新网站
。 -
修改默认值以添加 student 前缀。
student-bucket-{{{ project_0.project_id | "PREFIX" }}}-1 注意:
请确保网站下拉菜单中包含 student-bucket--1,然后再继续操作。 该网站的网域将沿用此设置。 -
点击注册应用按钮。
-
点击下一步 > 下一步 > 前往控制台。
注意:
更改默认 Firebase 网站网域需要更改本地环境。
具体而言,我们需要:- 更新
firebase.json
以添加自定义网站 ID。为您的网站设置部署目标 - 使用命令
firebase deploy --only hosting:student-bucket-
时,请使用网站 ID-1
- 更新
现在,您已完成配置 Firebase 应用。
验证您已完成的任务
点击检查我的进度,验证已完成以下目标:
任务 2.启用 Firebase 产品
Firebase Authentication
在 Firebase 控制台中,我们将设置 Firebase Authentication。
-
点击左侧导航面板中的 Build 下拉菜单按钮。
-
选择 Authentication 功能块,然后点击开始:
-
点击登录方法标签页,然后点击 Google 这一项。
-
点击右上角的启用切换开关,对于项目支持邮箱,从下拉列表中选择您的实验账号。
{{{user_0.username | "<用户名>"}}} 现在,您将看到类似下图的页面:
-
验证上面的设置后,点击保存按钮。
注意:
在 Firebase 中使用自定义网域时,您还需要修改“已获授权的网域”设置。 -
点击设置标签页
-
在网域标题下,点击已获授权的网域菜单项
现在,您将看到类似下图的页面:
-
点击添加网域按钮
-
输入以下网域:
student-bucket-{{{ project_0.project_id | PROJECT_ID }}}-1.web.app 注意:
添加自定义网域后,Firebase OAuth 流程才能正常运行。 -
点击添加按钮
验证您已完成的任务
点击检查我的进度,验证已完成以下目标:
Firebase Firestore
在 Firebase 控制台中,我们将设置 Firebase Authentication。
-
点击左侧导航面板中的 Build 下拉菜单按钮。
-
选择 Firestore Database 功能块,然后点击创建数据库:
-
接受默认设置,然后点击下一步
-
点击创建以预配 Cloud Firestore
-
点击规则标签页
注意:
要使用身份验证,我们需要更新 Firestore 数据库的安全规则。 在新规则中,我们允许在用户通过身份验证的情况下对数据库进行读/写操作。 -
按如下所示更新规则:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /customers/{email} { allow read, write: if request.auth.token.email == email; } match /customers/{email}/{document=**} { allow read, write: if request.auth.token.email == email; } } }
现在,您已使用自定义网站标识符设置了 Firebase Authentication 和 Firestore。后端配置现已完成。
Firebase Localhost
您协助 Patrick 设置了一个可正常运作的 Firebase Hosting 环境,Web 开发者可以在其中部署自己的代码。
然而,Patrick 从未启用过 Firebase Authentication,也没有在 Firebase 中部署过代码,因此他向 Ruby 发邮件寻求帮助…
Patrick,IT 管理员 |
Ruby,您好! 感谢您提供的所有建议!Firebase 环境看起来已完全就绪。我的下一项任务是部署网站开发者的代码。 您能介绍一下这需要做哪些准备,以及下一步我需要做什么吗? Patrick |
Ruby,顾问 |
Patrick,您好! 太好了,我将向您发送如何运行应用和添加以下功能的说明:
Ruby |
Patrick,DevOps 工程师 |
Ruby,您好! 听起来工作量还不小。 是不是每次我想添加新内容时,都必须更改结构?更何况,所做的更新还要过些时间才能体现出来... Patrick |
Ruby,顾问 |
Patrick,您好! 大部分繁重的工作都可以使用 Firebase 库来完成。 Firebase 提供了一些出色的命令行工具,可帮助您从 localhost 连接到后端 Firebase 项目。 使用 项目设置完毕后,您只需在命令行中调用 Ruby |
Patrick,IT 管理员 |
Ruby,您好! 哇,这让我感觉好多了!Firebase Hosting 是越来越好了 :-) Patrick |
任务 3.安装 Firebase CLI
使用 IDE 连接 Firebase 并部署应用。
开发环境已预配置 Firebase 工具。
-
从“实验详细信息”面板复制 IDE 链接
{{{ project_0.startup_script.service_url | "IDE" }}} -
将链接粘贴到新的无痕式浏览器标签页中,以打开 Cloud Code。
-
依次点击“应用”菜单 () > 终端 > 新终端,以打开终端。
-
从命令行克隆 GitHub 代码库:
git clone https://github.com/rosera/pet-theory.git -
点击左侧面板中的探索器图标,然后点击打开文件夹 > pet-theory > lab02。点击确定。
注意:
如果您看到Do you trust the authors of the files in this folder?
(您信任此文件夹中文件的作者吗?)的弹出式窗口,请勾选相应复选框,然后点击 Yes, I trust the authors(是的,我信任作者)。 -
依次点击“应用”菜单 () > 终端 > 新终端,再次打开终端。
-
更新节点软件包:
npm i 输出示例:
added 630 packages, and audited 631 packages in 42s 69 packages are looking for funding run `npm fund` for details found 0 vulnerabilities npm notice npm notice New minor version of npm available! 10.7.0 -> 10.8.3 npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.8.3 npm notice To update run: npm install -g npm@10.8.3 npm notice npm warn using --force Recommended protections disabled. up to date, audited 631 packages in 2s 69 packages are looking for funding run `npm fund` for details found 0 vulnerabilities
现在,您可以将应用关联到后端 Firebase 项目了。
任务 4.授予 Firebase 访问权限
在 IDE 中,连接 Firebase 并部署应用。
-
输入以下命令,授予 Firebase 项目访问权限:
firebase login --no-localhost 注意:
Firebase 会尝试授权本地环境与 Firebase 项目建立连接。 因此,请确保在无痕式窗口中执行浏览器活动,以便使用相应的凭据执行此操作。 -
如果系统询问 Firebase 是否可以收集错误报告信息,请输入 Y,然后按 Enter 键。
-
在新的无痕式浏览器标签页中复制并粘贴生成的网址,然后按 Enter 键(直接点击链接会出错)。
-
选择您的实验账号,然后点击允许。
-
点击 Yes, I just ran this command(是,我刚才运行的是此命令)以继续
点击 Yes, this is my session ID(是,这是我的会话 ID)确认您的会话 ID。
-
然后,您会获得一个访问代码:
-
复制该访问代码,将其粘贴到 Cloud Shell 提示 Enter authorization code:(输入授权代码:)中,然后按 Enter 键。
您应该会收到类似以下响应的输出:
输出示例:
此时,localhost 已关联至后端 Firebase 项目。
Firebase 现已连接并获得授权。下一步是初始化要使用的 Firebase 产品。
任务 5.初始化 Firebase 产品
在 IDE 中,告诉 Firebase 哪些产品是必需的。
-
在当前工作目录中初始化一个新 Firebase 项目:
firebase init 注意:
运行此命令后,系统会引导您完成设置项目目录和 Firebase 产品的每个步骤。 系统会要求您选择要在此文件夹中设置的 Firebase CLI 功能。 使用箭头键在列表中向上和向下移动。使用空格键选择某项产品。 -
我们需要以下产品:
- Firestore
- Hosting
-
使用方向键和空格键选择 Firestore 和 Hosting。确保您的 shell 符合以下所示选择,然后按 Enter 键:
? Which Firebase CLI features do you want to set up for this folder?Press Space to select features, then Enter to confirm your choices.◯ Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default insta ◉ Firestore: Configure security rules and indexes files for Firestore ◯ Functions: Configure a Cloud Functions directory and its files ❯◉ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys ◯ Hosting: Set up GitHub Action deploys ◯ Storage: Configure a security rules file for Cloud Storage -
执行其余步骤来配置 Firebase:
- 使用向下键选择 Use an existing project(使用现有项目),然后按 Enter 键。
- 从列表中选择您的项目 ID
,然后按 Enter 键。 - 按 Enter 键,然后按 N 键,以保留 firestore.rules 文件。
- 按 Enter 键,然后按 N 键,以保留 firestore.indexes.json 文件。
- 按 Enter 键保留公共目录,然后按 N 键以禁止重写 /index.html 文件。
- 按 Enter 键,出现“Set up automatic builds and deploys with GitHub?”(设置使用 GitHub 自动构建和部署)时,按 N 键。
- 当提示覆盖 404.html 文件时,输入 N。
- 当提示覆盖 index.html 文件时,输入 N。
输出示例:
✔ Wrote public/404.html ✔ Wrote public/index.html i Writing configuration info to firebase.json... i Writing project information to .firebase... i Writing gitignore file to .gitignore... ✔ Firebase initialization complete!
本地配置现已完成。
任务 6.部署到 Firebase
请在终端中继续完成此步骤。 确保您仍然位于 pet-theory/lab02 文件夹中。
-
修改并更新 firebase.json 中 site 的 hosting 部分
预期输出
{ ... "hosting": { "site": "student-bucket-{{{ project_0.project_id | PROJECT_ID }}}-1", ... } } -
使用您的网站 ID 值部署 Firebase 应用,例如:
firebase deploy --only hosting:student-bucket-{{{ project_0.project_id | PROJECT_ID }}}-1 输出:
✔ Deploy complete! Project Console: https://console.firebase.google.com/project/project_0.project_id| "PROJECT_ID"/overview Hosting URL: https://student-bucket-{{{ project_0.project_id| "site" }}}-1.web.app -
复制托管网址(应类似于
.web.app),然后在新无痕式标签页中打开它。 https://student-bucket-{{{ project_0.project_id | PROJECT_ID }}}-1.web.app 重要提示:
在本实验中,请勿使用个人凭据进行身份验证。 请使用账号:执行 Google 登录! -
点击使用 Google 账号登录按钮:
注意:
如果看到 browser is not supported or 3rd party cookies and data may be disabled(浏览器不受支持,或者第三方 Cookie 和数据可能会被禁用)错误,请务必在浏览器中启用 Cookie。 在 Chrome 浏览器中,点击网址标签页最右侧的眼睛图标,然后点击弹出式窗口中的蓝色链接,即可启用 Cookie。点击网站无法正常运行?链接,可更新浏览器设置以接受 Cookie。 -
使用为您提供的用户名(例如
)登录。以下页面即会打开: 像 Pet Theory 这样的小公司没有资源或必需的技能来做这件事。在这种情况下,允许应用用户使用他们现有的 Google 账号(或任何其他身份提供方)登录可能更方便!
注意:
管理密码是一项艰巨的任务,可能会给公司带来额外风险。此外,用户也不想再创建一个用户 ID 和密码。
现在,您已经部署了允许用户使用 Google 身份验证访问预约应用的代码。
任务 7.向 Web 应用中添加客户页面
返回终端,使用编辑器查看 public 文件夹中的文件。
-
打开
public/customer.js
文件,然后复制并粘贴以下代码:let user; firebase.auth().onAuthStateChanged(function(newUser) { user = newUser; if (user) { const db = firebase.firestore(); db.collection("customers").doc(user.email).onSnapshot(function(doc) { const cust = doc.data(); if (cust) { document.getElementById('customerName').setAttribute('value', cust.name); document.getElementById('customerPhone').setAttribute('value', cust.phone); } document.getElementById('customerEmail').innerText = user.email; }); } }); document.getElementById('saveProfile').addEventListener('click', function(ev) { const db = firebase.firestore(); var docRef = db.collection('customers').doc(user.email); docRef.set({ name: document.getElementById('customerName').value, email: user.email, phone: document.getElementById('customerPhone').value, }) }) -
打开
public/styles.css
文件并粘贴以下代码:body { background: #ECEFF1; color: rgba(0,0,0,0.87); font-family: Roboto, Helvetica, Arial, sans-serif; margin: 0; padding: 0; } #message { background: white; max-width: 360px; margin: 100px auto 16px; padding: 32px 24px 16px; border-radius: 3px; } #message h3 { color: #888; font-weight: normal; font-size: 16px; margin: 16px 0 12px; } #message h2 { color: #ffa100; font-weight: bold; font-size: 16px; margin: 0 0 8px; } #message h1 { font-size: 22px; font-weight: 300; color: rgba(0,0,0,0.6); margin: 0 0 16px;} #message p { line-height: 140%; margin: 16px 0 24px; font-size: 14px; } #message a { display: block; text-align: center; background: #039be5; text-transform: uppercase; text-decoration: none; color: white; padding: 16px; border-radius: 4px; } #message, #message a { box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } #load { color: rgba(0,0,0,0.4); text-align: center; font-size: 13px; } @media (max-width: 600px) { body, #message { margin-top: 0; background: white; box-shadow: none; } body { border-top: 16px solid #ffa100; } } -
在终端命令行中,运行以下命令:
firebase deploy --only hosting:student-bucket-{{{ project_0.project_id | PROJECT_ID }}}-1 输出:
✔ Deploy complete! Project Console: https://console.firebase.google.com/project/project_0.project_id| "PROJECT_ID"/overview Hosting URL: https://student-bucket-{{{ project_0.project_id| "site" }}}-1.web.app -
前往应用标签页,按 CMND+SHIFT+R (Mac) 或 CTRL+SHIFT+R (Windows) 强制刷新页面。常规刷新无法显示所需更新。
-
输入一些客户信息:编造一个姓名和电话号码
客户姓名:
John 客户电话:
98473757454 -
点击保存配置文件。
-
返回 Firebase 控制台
-
点击 构建 > Firestore Database,以查看保存的个人资料信息:
-
返回 Web 应用页面并点击 Appointments(预约)链接。您将看到一个空白页面,因为还没有部署预约代码。
验证您已完成的任务
点击检查我的进度,验证已完成以下目标:
太酷了!
Firestore 会实时更新客户端(Web 应用和原生移动应用),用户无需刷新或重新加载。
恭喜!
在本实验中,您使用 Firebase 创建了一个强大的无服务器 Web 应用。创建并配置 Firebase 项目后,您添加了 Firestore 安全功能,以自动执行服务器端身份验证和授权。然后,您在 Web 应用中添加了 Google 登录功能,并配置了数据库,使用户可以添加联系信息和预约。最后,您探索并部署了允许用户安排预约的代码,并在 Web 应用中查看了 Firebase 的实时更新。现在,您可以参加此学习路线中的更多实验了。
后续步骤/了解详情
- Google Cloud - 什么是无服务器?
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
上次更新手册的时间:2024 年 10 月 16 日
上次测试实验的时间:2024 年 10 月 16 日
版权所有 2024 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。