最新版本的 Google Identity Toolkit 已发布为 Firebase Authentication。今后,Identity Toolkit 上的功能工作将被冻结,所有新功能的开发都将在 Firebase Authentication 上完成。我们建议 Identity Toolkit 开发者尽快将其应用迁移到 Firebase Authentication;不过,Identity Toolkit 将继续工作,并且不会被弃用。
新功能
与 Google Identity Toolkit 相比,Firebase Authentication 已经有一些重要的功能增强:
访问所有 Firebase
Firebase 是一个移动平台,可助您快速开发优质应用、扩大用户群并赚取更多收益。Firebase 由多种补充功能组成,您可以根据自己的需求组合搭配这些功能,包括用于以下用途的基础架构:移动分析、云消息传递、实时数据库、文件存储、静态托管、远程配置、移动崩溃报告和 Android 测试。
界面更新
我们根据 Google 的最新用户体验研究,完全重建了界面流程。这包括密码恢复、帐号关联、新/现有帐号消除歧义流程(通常需要很长时间来编写和调试)。它集成了 Android 上的 Smart Lock(密码专用),从而显著提升了参与该计划的应用的登录和注册转化率。它还支持轻松修改主题,以匹配您的应用;为最大限度提高可定制性,Android 和 iOS 版本已开源。
简化服务器设置
我们让开发者能够更轻松地使用 Firebase Authentication。借助 Identity Toolkit,我们发现许多开发者选择不实现电子邮件恢复流程,该流程会导致其用户在忘记密码时无法恢复帐号。Firebase Authentication 可以向用户发送验证电子邮件、重设密码和更改密码的消息,并可以轻松地为用户自定义文本。此外,您不再需要托管用于托管重定向和完成密码更改操作的界面 widget。
新版管理控制台
Firebase 拥有新的开发者控制台,并且您可以在“身份验证”部分查看、修改和删除用户。这对于调试登录和注册流程会很有帮助。 借助控制台,您还可以配置身份验证方法和自定义电子邮件模板。
新 SDK
现在,Identity Toolkit 的所有服务器 API 都可以在我们的每个客户端库(Android、iOS、Web)中以原生方式提供。开发者无需受制于固定的界面,就可以登录和注册新老用户、访问用户属性、关联、更新和删除帐号、重置密码,还能执行更多其他操作。如果您愿意,可以基于此 API 手动构建自己的整个登录流程和体验。
移动应用的会话管理
借助 Identity Toolkit,应用会根据 Identity Toolkit 中的初始身份验证事件创建自己的会话状态。Firebase Auth 使用一项后端服务,该后端服务接受一个从身份验证事件中生成的刷新令牌,并将其换成时长为一小时的 Android、iOS 和 JavaScript 访问令牌。当用户更改密码后,刷新令牌将无法再生成新的访问令牌,因此系统会停用访问权限,直到用户在设备上重新进行身份验证。
匿名和 GitHub 身份验证
Firebase Authentication 支持两种新的身份验证类型:GitHub 和匿名身份验证。匿名登录可用于创建唯一身份用户 ID,而无需要求用户完成任何登录或注册流程。对于匿名用户,您现在可以像对待普通用户一样进行经过身份验证的 API 调用。当用户决定注册帐号时,系统会以相同的用户 ID 保留所有 activity。对于服务器端购物车或您希望在引导用户完成注册流程之前吸引用户的任何应用,这非常有用。
功能差异
Firebase Authentication 中目前不提供某些 Identity Toolkit 功能,而其他功能已经过重新设计,其工作方式也有所不同。如果这些功能对您的应用很重要,您可以选择不立即迁移。在许多情况下,这些功能可能对您的应用并不重要,或者存在可让您继续迁移的简单回退。
服务器端差异
核心 Identity Toolkit 服务及其底层 REST API、帐号验证逻辑和主用户数据库只经历了细微的更新。但是,某些功能以及将 Firebase Authentication 集成到服务的方式已发生变化。
身份提供方
不支持 PayPal 和 AOL。使用来自这些 IDP 的帐号的用户仍然可以通过密码恢复流程登录您的应用,并为其帐号设置密码。
服务器库
目前,有适用于 Java、Node.js、Python、Go 和 C# 的 Firebase Admin SDK。
帐号管理电子邮件
密码重置、电子邮件验证和电子邮件更改消息可以由 Firebase 或开发者自己的邮件服务器执行。目前,Firebase 电子邮件模板仅提供有限的自定义功能。
电子邮件地址变更确认
在 Identity Toolkit 中,当用户决定更改其电子邮件地址时,它会向新地址发送一封电子邮件,其中包含继续执行电子邮件地址更改流程的链接。
Firebase 通过向旧电子邮件地址发送撤消电子邮件以及用于还原更改的链接来确认电子邮件地址更改。
IDP 部署
Identity Toolkit 能够将身份提供方逐步添加到您的登录系统,以便您可以试验对支持请求的影响。此功能已从 Firebase Authentication 中移除。
客户端差异
在 Firebase 中,Google Identity Toolkit 提供的功能分为两个组件:
Firebase Authentication SDK
在 Firebase Authentication 中,Identity Toolkit 的 REST API 提供的功能已打包在适用于 Android、iOS 和 JavaScript 的客户端 SDK 中。您可以使用客户端 SDK 来登录和注册用户;访问用户个人资料信息;关联、更新和删除帐号;以及重置密码,而无需通过 REST 调用与后端服务进行通信。
FirebaseUI 身份验证
管理登录、注册、密码恢复和帐号关联的所有界面流程都已使用 Frebase Authentication SDK 重新构建。它们作为适用于 iOS 和 Android 的开源 SDK 提供,让您能够以 Identity Toolkit 无法实现的方式完全自定义流程。
其他区别包括:
会话和迁移
由于会话在 Identity Toolkit 和 Firebase Authentication 中的管理方式不同,因此用户的现有会话将在升级 SDK 时终止,并且用户必须重新登录。
准备工作
您必须先从 Identity Toolkit 迁移到 Firebase Authentication,
打开 Firebase 控制台,点击导入 Google 项目,然后选择您的 Identity Toolkit 项目。
点击 settings > 权限,打开“IAM 和管理”页面。
打开服务账号页面。您可以在此处看到之前为 Identity Toolkit 配置的服务帐号。
在相应服务帐号旁边,依次点击 more_vert > 创建密钥。然后,在创建私钥对话框中,将密钥类型设置为 JSON,然后点击创建。系统会为您下载包含服务帐号凭据的 JSON 文件。下一步需要用此文件初始化 SDK。
返回 Firebase 控制台。 在“身份验证”部分中,打开电子邮件模板页面。在此页面上,您可以自定义应用的电子邮件模板。
在 Identity Toolkit 中,当用户重置密码、更改电子邮件地址并验证其电子邮件地址时,您需要从 Identity Toolkit 服务器获取 OOB 代码,然后通过电子邮件将该代码发送给用户。Firebase 会根据您配置的模板发送电子邮件,您无需执行任何额外操作。
可选:如果您需要在服务器上访问 Firebase 服务,请安装 Firebase SDK。
您可以使用
npm
安装 Firebase Node.js 模块:$ npm init $ npm install --save firebase-admin
在您的代码中,可以使用以下代码访问 Firebase:
var admin = require('firebase-admin'); var app = admin.initializeApp({ credential: admin.credential.cert('path/to/serviceAccountCredentials.json') });
接下来,请针对您的应用平台(Android、iOS、Web)完成迁移步骤。
服务器和 JavaScript
显著变更
从 Identity Toolkit 中实现 Firebase 的 Web 实现还有许多其他差异。
网络会话管理
以前,当用户使用 Identity Toolkit 微件进行身份验证时,系统会为用户设置 Cookie,用于引导会话。此 Cookie 的生命周期为两周,曾用于允许用户使用帐号管理 widget 更改密码和电子邮件地址。某些网站使用此 Cookie 对网站上的所有其他网页请求进行身份验证。其他网站则使用该 Cookie 通过其框架的 Cookie 管理系统创建自己的 Cookie。
Firebase 客户端 SDK 现在可以管理 Firebase ID 令牌,并结合使用 Firebase Authentication 的后端来保持会话新鲜度。在发生重要的帐号更改(例如用户密码更改)时,后端会让会话过期。Firebase ID 令牌不会自动设置为 Web 客户端上的 Cookie,其生命周期只有一小时。除非您希望会话仅持续一小时,否则 Firebase ID 令牌不适合用作 Cookie 来验证您的所有页面请求。相反,您需要设置监听器以监听用户何时登录,获取 Firebase ID 令牌,验证令牌,并通过框架的 Cookie 管理系统创建您自己的 Cookie。
您需要根据应用的安全需求设置 Cookie 的会话生命周期。
Web 登录流程
以前,用户会在登录时被重定向到
accountchooser.com
,以了解用户想要使用的标识符。现在,Firebase Auth 界面的流程从登录方法列表开始,其中包括一个电子邮件选项,该选项在 Web 上转到accountchooser.com
,并在 Android 上使用 hintRequest API。此外,Firebase 界面中不再需要电子邮件地址。这样可以更轻松地支持匿名用户、自定义身份验证用户或来自无需电子邮件地址的提供方的用户。帐号管理微件
此微件提供了一个界面,供用户更改电子邮件地址、更改密码或解除其帐号与身份提供方的关联。它目前正在开发中。
登录按钮/微件
不再提供登录按钮和用户卡片等微件。您可以使用 Firebase Authentication API 非常轻松地构建这些功能。
无 signOutUrl
您需要调用
firebase.auth.signOut()
并处理回调。没有 oobActionUrl
电子邮件发送现在由 Firebase 处理,并在 Firebase 控制台中进行配置。
CSS 自定义
FirebaseUI 使用 Material Design Lite 样式,这会动态添加 Material Design 动画。
第 1 步:更改服务器代码
如果您的服务器依赖 Identity Toolkit 令牌(有效期为两周)来管理 Web 用户会话,则您需要将该服务器转换为使用自己的会话 Cookie。
- 实现一个端点,用于验证 Firebase ID 令牌以及为用户设置会话 Cookie。客户端应用将 Firebase ID 令牌发送到此端点。
- 如果传入请求包含您自己的会话 Cookie,您可以考虑用户已通过身份验证。否则,请将请求视为未经身份验证。
- 如果您不希望任何用户丢失现有的登录会话,应该等待两周的所有 Identity Toolkit 令牌过期,或者同时为您的 Web 应用执行双令牌验证(如下文第 3 步所述)。
接下来,由于 Firebase 令牌与 Identity Toolkit 令牌不同,因此您必须更新令牌验证逻辑。将 Firebase Server SDK 安装到您的服务器;或者,如果您使用的是 Firebase Server SDK 不支持的语言,请下载适用于您的环境的 JWT 令牌验证库,并正确验证令牌。
首次进行上述更新时,您可能仍然有依赖于 Identity Toolkit 令牌的代码路径。如果您有 iOS 或 Android 应用,用户需要升级到该应用的新版本,新代码路径才能正常运行。如果您不想强制用户更新应用,则可以添加其他服务器验证逻辑,该逻辑会检查令牌并确定是使用 Firebase SDK 还是 Identity Toolkit SDK 来验证令牌。如果您只有 Web 应用,所有新的身份验证请求都将转移到 Firebase,因此您只需使用 Firebase 令牌验证方法即可。
第 2 步:更新 HTML
将 Firebase 初始化代码添加到您的应用:
- 在 Firebase 控制台中打开您的项目。
- 在“概览”页面上,点击添加应用,然后点击将 Firebase 添加到您的 Web 应用。系统即会显示一个用于初始化 Firebase 的代码段。
- 将初始化代码段复制并粘贴到您的网页中。
将 FirebaseUI Auth 添加到您的应用:
<script src="https://www.gstatic.com/firebasejs/ui/live/0.4/firebase-ui-auth.js"></script> <link type="text/css" rel="stylesheet" href="https://www.gstatic.com/firebasejs/ui/live/0.4/firebase-ui-auth.css" /> <!-- ******************************************************************************************* * TODO(DEVELOPER): Paste the initialization snippet from: * Firebase Console > Overview > Add Firebase to your web app. * ***************************************************************************************** --> <script type="text/javascript"> // FirebaseUI config. var uiConfig = { 'signInSuccessUrl': '<url-to-redirect-to-on-success>', 'signInOptions': [ // Leave the lines as is for the providers you want to offer your users. firebase.auth.GoogleAuthProvider.PROVIDER_ID, firebase.auth.FacebookAuthProvider.PROVIDER_ID, firebase.auth.TwitterAuthProvider.PROVIDER_ID, firebase.auth.GithubAuthProvider.PROVIDER_ID, firebase.auth.EmailAuthProvider.PROVIDER_ID ], // Terms of service url. 'tosUrl': '<your-tos-url>', }; // Initialize the FirebaseUI Widget using Firebase. var ui = new firebaseui.auth.AuthUI(firebase.auth()); // The start method will wait until the DOM is loaded. ui.start('#firebaseui-auth-container', uiConfig); </script>
从您的应用中移除 Identity Toolkit SDK。
如果您依赖 Identity Toolkit ID 令牌进行会话管理,则必须在客户端进行以下更改:
使用 Firebase 成功登录后,请调用
firebase.auth().currentUser.getToken()
获取 Firebase ID 令牌。将 Firebase ID 令牌发送到后端服务器,对其进行验证,并颁发您自己的会话 Cookie。
在执行敏感操作或向您的服务器发送经过身份验证的修改请求时,请勿仅依赖会话 Cookie。您需要提供额外的跨网站请求伪造 (CSRF) 保护。
如果您的框架未提供 CSRF 保护,一种防止攻击的方法是使用
getToken()
为已登录的用户获取 Firebase ID 令牌,并将该令牌添加到每个请求中(默认情况下,还会发送会话 Cookie)。然后,除了您的后端框架完成的会话 Cookie 检查之外,您还需使用 Firebase 服务器 SDK 验证该令牌。这会使 CSRF 攻击更难成功,因为 Firebase ID 令牌仅使用 Web 存储空间进行存储,绝不会存储在 Cookie 中。Identity Toolkit 令牌的有效期为两周。您可能希望继续颁发有效期为两周的令牌,也可以根据应用的安全要求增加或缩短令牌。当用户退出帐号时,清除会话 Cookie。
第 3 步:更新 IDP 重定向网址
在 Firebase 控制台中,打开“Authentication”部分,然后点击登录方法标签页。
对于您支持的每个联合登录提供方,请执行以下操作:
- 点击登录提供方的名称。
- 复制 OAuth 重定向 URI。
- 在登录提供方的开发者控制台中,更新 OAuth 重定向 URI。
Android
第 1 步:将 Firebase 添加到您的应用
打开 Firebase 控制台,然后选择已导入的 Identity Toolkit 项目。
在“概览”页面上,点击添加应用,然后点击将 Firebase 添加到您的 Android 应用。在“添加 Firebase”对话框中,提供应用的软件包名称和签名证书指纹,然后点击添加应用。然后,
google-services.json
配置文件会下载到您的计算机。将配置文件复制到 Android 应用模块的根目录。此配置文件包含项目和 Google OAuth 客户端信息。
在项目级
build.gradle
文件 (<var>your-project</var>/build.gradle
) 的defaultConfig
部分指定应用的软件包名称:defaultConfig { ….. applicationId "com.your-app" }
此外,在您的项目级
build.gradle
文件中,添加一个依赖项以包含 google-services 插件:buildscript { dependencies { // Add this line classpath 'com.google.gms:google-services:3.0.0' } }
在应用的应用级
build.gradle
文件 (<var>my-project</var>/<var>app-module</var>/build.gradle
) 中,将以下代码行添加到底部以启用 google-services 插件:// Add to the bottom of the file apply plugin: 'com.google.gms.google-services'
google-services 插件使用
google-services.json
文件将您的应用配置为使用 Firebase。此外,在应用级
build.gradle
文件中,添加 Firebase Authentication 依赖项:compile 'com.google.firebase:firebase-auth:22.3.0' compile 'com.google.android.gms:play-services-auth:20.7.0'
第 2 步:移除 Identity Toolkit SDK
- 从
AndroidManifest.xml
文件中移除 Identity Toolkit 配置。此信息包含在google-service.json
文件中,并由 google-services 插件加载。 - 从您的应用中移除 Identity Toolkit SDK。
第 3 步:将 FirebaseUI 添加到您的应用
将 FirebaseUI Auth 添加到您的应用。
在您的应用中,将对 Identity Toolkit SDK 的调用替换为对 FirebaseUI 的调用。
iOS
第 1 步:将 Firebase 添加到您的应用
运行以下命令,将 Firebase SDK 添加到您的应用:
$ cd your-project directory $ pod init $ pod 'Firebase'
打开 Firebase 控制台,然后选择已导入的 Identity Toolkit 项目。
在“概览”页面上,点击添加应用,然后点击将 Firebase 添加到您的 iOS 应用。在“添加 Firebase”对话框中,提供应用的软件包 ID 和 App Store ID,然后点击添加应用。然后,
GoogleService-Info.plist
配置文件会下载到您的计算机。如果您的项目中有多个软件包 ID,则必须在 Firebase 控制台中关联每个软件包 ID,以便它可以拥有自己的GoogleService-Info.plist
文件。将配置文件复制到 Xcode 项目的根目录并将其添加到所有目标。
第 2 步:移除 Identity Toolkit SDK
- 从应用的 Podfile 中移除
GoogleIdentityToolkit
。 - 运行
pod install
命令。
第 3 步:将 FirebaseUI 添加到您的应用
将 FirebaseUI Auth 添加到您的应用。
在您的应用中,将对 Identity Toolkit SDK 的调用替换为对 FirebaseUI 的调用。