从 Google Identity Toolkit 迁移到 Firebase Authentication

最新版本的 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(密码专用),这显著改进了参与实验的应用的登录和注册转换。它还支持轻松修改主题以匹配您的应用,为实现最大程度可定制性,AndroidiOS 版本已开源。

  • 简化的服务器设置

    我们让开发者能够更轻松地使用 Firebase Authentication。使用 Identity Toolkit 时,我们发现许多开发者选择不实现电子邮件恢复流程,该流程会导致用户在忘记密码时无法恢复帐号。Firebase Authentication 可以向用户发送电子邮件验证、重设密码和更改密码消息,并且可以轻松针对用户自定义其中的文本。此外,您无需再托管用于托管重定向和完成密码更改操作的界面 widget

  • 新版管理控制台

    Firebase 提供了新版开发者控制台,您可以在“身份验证”部分查看、修改和删除您的用户。这对于调试登录和注册流程非常有用。通过该控制台,您还可以配置身份验证方法并自定义电子邮件模板。

  • 新 SDK

    现在,Identity Toolkit 的所有服务器 API 都可以在我们的每个客户端库(Android、iOS、Web)中以原生方式使用。开发者将能够登录和注册新老用户、访问用户属性、关联、更新和删除帐号、重置密码,而无需受限于一个固定的界面。如果您愿意,也可以在此 API 的基础上手动构建自己的整个登录流程和体验。

  • 针对移动应用的会话管理

    借助 Identity Toolkit,应用可以根据 Identity Toolkit 中的初始身份验证事件创建自己的会话状态。Firebase Auth 使用的后端服务获取从身份验证事件生成的刷新令牌,并用它交换 1 小时长的 Android、iOS 和 JavaScript 访问令牌。当用户更改密码后,刷新令牌将无法再生成新的访问令牌,因此,在用户在该设备上重新进行身份验证之前,系统会停用访问权限。

  • 匿名和 GitHub 身份验证

    Firebase Authentication 支持两种新的身份验证类型:GitHub 和匿名。您可以使用匿名登录来创建唯一用户 ID,而无需用户进行任何登录或注册过程。借助匿名用户,您现在可以像对普通用户一样进行经过身份验证的 API 调用。当用户决定注册帐号时,系统会使用同一用户 ID 保留所有活动。这非常适合服务器端购物车或任何您希望在引导用户完成注册流程之前与用户进行互动的应用。

功能差异

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 来登录和注册用户;访问用户个人资料信息;关联、更新和删除帐号,以及使用客户端 SDK 重置密码,而不必通过 REST 调用与后端服务通信。

  • FirebaseUI 身份验证

    管理登录、注册、密码恢复和帐号关联的所有界面流程均已使用 Frebase Authentication SDK 重新构建。它们作为适用于 iOS 和 Android 的开源 SDK 提供,可让您以 Identity Toolkit 无法实现的方式全面自定义流程。

其他差异包括:

  • 会话和迁移

    由于 Identity Toolkit 和 Firebase Authentication 中的会话管理方式不同,因此用户的现有会话将在升级 SDK 时终止,届时您的用户必须重新登录。

准备工作

您必须先从 Identity Toolkit 迁移到 Firebase Authentication,

  1. 打开 Firebase 控制台,点击导入 Google 项目,然后选择您的 Identity Toolkit 项目。

  2. 点击 > 权限以打开“IAM 和管理”页面。

  3. 打开服务账号页面。在这里,您可以看到之前为 Identity Toolkit 配置的服务帐号。

  4. 在服务帐号旁边,点击 > 创建密钥。然后,在创建私钥对话框中,将密钥类型设置为 JSON,并点击创建。系统会为您下载包含服务帐号凭据的 JSON 文件。您在下一步初始化 SDK 时需要用到此文件。

  5. 返回 Firebase 控制台。 在“身份验证”部分中,打开电子邮件模板页面。在此页面上,您可以自定义应用的电子邮件模板。

    在 Identity Toolkit 中,当用户重置密码、更改电子邮件地址并验证其电子邮件地址时,您需要从 Identity Toolkit 服务器获取 OOB 代码,然后通过电子邮件将该代码发送给用户。Firebase 会根据您配置的模板发送电子邮件,无需执行任何其他操作。

  6. 可选:如果您需要访问服务器上的 Firebase 服务,请安装 Firebase SDK。

    1. 您可以使用 npm 安装 Firebase Node.js 模块:

      $ npm init
      $ npm install --save firebase-admin
      
    2. 在您的代码中,您可以通过以下方式访问 Firebase:

      var admin = require('firebase-admin');
      var app = admin.initializeApp({
        credential: admin.credential.cert('path/to/serviceAccountCredentials.json')
      });
      

接下来,完成适用于您的应用平台(AndroidiOSWeb)的迁移步骤。

服务器和 JavaScript

显著变更

在 Identity Toolkit 的 Web 实现方面,存在许多其他差异。

  • Web 会话管理

    以前,当用户使用 Identity Toolkit 微件进行身份验证时,系统会为该用户设置一个用于引导会话的 Cookie。此 Cookie 的有效期为两周,用于允许用户使用帐号管理微件更改密码和电子邮件地址。某些网站使用此 Cookie 对网站上的所有其他网页请求进行身份验证。其他网站使用 Cookie 通过其框架的 Cookie 管理系统创建自己的 Cookie。

    Firebase 客户端 SDK 现在可管理 Firebase ID 令牌,并与 Firebase Authentication 的后端搭配使用以保持会话常新。当发生重要的帐号更改(如用户密码更改)时,后端会过期会话。Firebase ID 令牌在 Web 客户端上不会自动设置为 Cookie,并且有效期只有一小时。除非您需要的会话时长仅为 1 小时,否则 Firebase ID 令牌不适合用作 Cookie 来验证您的所有页面请求。相反,您需要针对用户登录时设置监听器获取 Firebase ID 令牌验证令牌,并通过框架的 Cookie 管理系统创建自己的 Cookie。

    您需要根据应用的安全需求设置 Cookie 的会话生命周期。

  • 网页登录流程

    以前,系统会在用户登录时将用户重定向到 accountchooser.com,以了解用户要使用的标识符。Firebase Auth 界面现在会先列出登录方法,其中包括一个电子邮件选项,该选项会转到 accountchooser.com(网页版)并使用 hintRequest API(Android 版)。此外,Firebase 界面中也不再需要电子邮件地址。这样可以更轻松地支持匿名用户、自定义身份验证用户或来自不需要电子邮件地址的提供方的用户。

  • “帐号管理”微件

    此 widget 提供了一个界面,可让用户更改电子邮件地址、更改密码或解除其帐号与身份提供方之间的关联。它目前正在开发中。

  • 登录按钮/微件

    我们不再提供登录按钮和用户卡片等 widget。使用 Firebase Authentication API 可以非常轻松地进行构建。

  • 没有 signOutUrl

    您需要调用 firebase.auth.signOut() 并处理回调。

  • 无 oobActionUrl

    电子邮件发送现在由 Firebase 处理,并在 Firebase 控制台中配置。

  • CSS 自定义

    FirebaseUI 使用 Material Design Lite 样式,这种样式可动态添加 Material Design 动画。

第 1 步:更改服务器代码

  1. 如果您的服务器依赖 Identity Toolkit 令牌(有效期为两周)来管理 Web 用户会话,则您需要将该服务器转换为使用自己的会话 Cookie。

    1. 实现用于验证 Firebase ID 令牌并为用户设置会话 Cookie 的端点。客户端应用将 Firebase ID 令牌发送到此端点。
    2. 如果传入请求包含您自己的会话 Cookie,则可以认为用户已通过身份验证。否则,将请求视为未经身份验证。
    3. 如果您不希望任何用户丢失其现有的登录会话,则应等待两个星期,以便所有 Identity Toolkit 令牌过期,或者按下文第 3 步中的说明为您的 Web 应用执行双令牌验证。
  2. 接下来,由于 Firebase 令牌与 Identity Toolkit 令牌不同,因此您必须更新令牌验证逻辑。将 Firebase Server SDK 安装到您的服务器;或者,如果您使用 Firebase Server SDK 不支持的语言,请为您的环境下载 JWT 令牌验证库,并正确验证令牌

  3. 首次进行上述更新时,您可能仍有依赖于 Identity Toolkit 令牌的代码路径。如果您有 iOS 或 Android 应用,用户需要升级到应用的新版本,新代码路径才能正常运行。如果您不想强制用户更新应用,可以添加额外的服务器验证逻辑,用于检查令牌并确定其是否需要使用 Firebase SDK 或 Identity Toolkit SDK 来验证令牌。如果您只有一个 Web 应用,则所有新的身份验证请求都将转移到 Firebase,因此您只需使用 Firebase 令牌验证方法。

请参阅 Firebase Web API 参考文档

第 2 步:更新 HTML

  1. 将 Firebase 初始化代码添加到您的应用中:

    1. Firebase 控制台中打开您的项目。
    2. 在“概览”页面上,点击添加应用,然后点击将 Firebase 添加到您的 Web 应用。系统随即会显示用于初始化 Firebase 的代码段。
    3. 复制初始化代码段并将其粘贴到您的网页。
  2. FirebaseUI 身份验证添加到您的应用:

    <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>
    
  3. 从您的应用中移除 Identity Toolkit SDK。

  4. 如果您依赖 Identity Toolkit ID 令牌进行会话管理,则必须在客户端进行以下更改:

    1. 使用 Firebase 成功登录后,通过调用 firebase.auth().currentUser.getToken() 获取 Firebase ID 令牌。

    2. 将 Firebase ID 令牌发送到后端服务器,对其进行验证,然后发出您自己的会话 Cookie。

      在执行敏感操作或向服务器发送经过身份验证的修改请求时,不要仅依赖于会话 Cookie。您需要提供额外的跨网站请求伪造 (CSRF) 保护。

      如果您的框架不提供 CSRF 保护,则可以通过以下方式防止攻击:使用 getToken() 为已登录的用户获取一个 Firebase ID 令牌,并在每个请求中包含该令牌(默认情况下,系统还会发送会话 Cookie)。然后,除了您的后端框架完成的会话 Cookie 检查之外,您还需要使用 Firebase 服务器 SDK 验证该令牌。这将使 CSRF 攻击更难成功,因为 Firebase ID 令牌仅使用网站存储空间进行存储,绝不会在 Cookie 中存储。

    3. Identity Toolkit 令牌的有效期为两周。您可能需要继续颁发有效期为两周的令牌,或者根据应用的安全要求延长或缩短令牌的有效期。当用户退出帐号时,请清除会话 Cookie。

第 3 步:更新 IDP 重定向网址

  1. 在 Firebase 控制台中,打开“Authentication”部分,然后点击登录方法标签页。

  2. 对于您支持的每个联合登录提供方,请执行以下操作:

    1. 点击登录提供方的名称。
    2. 复制 OAuth 重定向 URI。
    3. 在登录提供方的开发者控制台中,更新 OAuth 重定向 URI。

Android

第 1 步:将 Firebase 添加到您的应用

  1. 打开 Firebase 控制台,然后选择您已导入的 Identity Toolkit 项目。

  2. 在“概览”页面上,点击添加应用,然后点击将 Firebase 添加到您的 Android 应用。在“添加 Firebase”对话框中,提供应用的软件包名称和签名证书指纹,并点击添加应用。然后,google-services.json 配置文件会下载到您的计算机。

  3. 将配置文件复制到 Android 应用模块的根目录。此配置文件包含项目和 Google OAuth 客户端信息。

  4. 在项目级 build.gradle 文件 (<var>your-project</var>/build.gradle) 的 defaultConfig 部分中,指定应用的软件包名称:

    defaultConfig {
       …..
      applicationId "com.your-app"
    }
    
  5. 同样在您的项目级 build.gradle 文件中,添加一个依赖项以包含 google-services 插件:

    buildscript {
     dependencies {
       // Add this line
       classpath 'com.google.gms:google-services:3.0.0'
     }
    }
    
  6. 在应用的应用级 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。

  7. 同样在应用级 build.gradle 文件中,添加 Firebase Authentication 依赖项:

    compile 'com.google.firebase:firebase-auth:23.0.0'
    compile 'com.google.android.gms:play-services-auth:21.2.0'
    

第 2 步:移除 Identity Toolkit SDK

  1. AndroidManifest.xml 文件中移除 Identity Toolkit 配置。此信息会包含在 google-service.json 文件中并由 google-services 插件加载。
  2. 从您的应用中移除 Identity Toolkit SDK。

第 3 步:将 FirebaseUI 添加到您的应用

  1. FirebaseUI 身份验证添加到您的应用。

  2. 在您的应用中,将对 Identity Toolkit SDK 的调用替换为对 FirebaseUI 的调用。

iOS

第 1 步:将 Firebase 添加到您的应用

  1. 运行以下命令,将 Firebase SDK 添加到您的应用:

    $ cd your-project directory
    $ pod init
    $ pod 'Firebase'
    
  2. 打开 Firebase 控制台,然后选择您已导入的 Identity Toolkit 项目。

  3. 在“概览”页面上,点击添加应用,然后点击将 Firebase 添加到您的 iOS 应用。在“添加 Firebase”对话框中,提供应用的软件包 ID 和 App Store ID,然后点击添加应用GoogleService-Info.plist 配置文件随即会下载到您的计算机中。如果您的项目中有多个软件包 ID,则必须在 Firebase 控制台中关联每个软件包 ID,以便其可以拥有自己的 GoogleService-Info.plist 文件。

  4. 将配置文件复制到 Xcode 项目的根目录,并将其添加到所有目标。

第 2 步:移除 Identity Toolkit SDK

  1. 从应用的 Podfile 中移除 GoogleIdentityToolkit
  2. 运行 pod install 命令。

第 3 步:将 FirebaseUI 添加到您的应用

  1. FirebaseUI 身份验证添加到您的应用。

  2. 在您的应用中,将对 Identity Toolkit SDK 的调用替换为对 FirebaseUI 的调用。