将 FCM HTTP v1 API 与 OAuth 2 访问令牌搭配使用

1. 简介

与 FCM 旧版 API 相比,FCM HTTP v1 API 使用短期访问令牌提供更安全的授权模型。为 FCM v1 API 生成访问令牌的步骤与旧版 API 的步骤截然不同。

此 Codelab 将引导您完成客户端和服务器端的设置过程,以便使用 FCM HTTP v1 API 向 Android 应用发送推送通知。其中重点介绍了针对 v1 API 生成凭据的关键步骤。

如需了解详情,请访问:

前提条件

  • 对 Java 和 Android 开发有基本的了解

学习内容

  • 客户端和服务器端设置的详细步骤,以便使用 FCM HTTP v1 API 向 Android 应用发送推送通知
  • 使用服务账号为 HTTP v1 API 生成凭据
  • 通过 HTTP v1 API 发送测试消息

您需要满足的条件

最新的稳定版 Android Studio

下列任一设备:

您选择的 Java 开发环境或代码编辑器

2. Firebase 项目和 Android 应用设置

在本 Codelab 结束时,您将能够使用 Firebase Cloud Messaging 向应用发送消息。在此之前,您需要创建一个 Firebase 项目。此 Codelab 还提供了一个 Android 应用,其中包含与 FCM 集成的示例代码。

Firebase 项目设置

Android 应用设置

此 Codelab 中提供的示例 Android 应用已与 FCM 集成。启动后,它会向 FCM 服务器注册并订阅某个主题。在此 Codelab 的后续步骤中,您将向主题发送一条主题消息,您的应用也会收到该消息。

3. 设置应用服务器

现在您的应用已设置完毕,您需要下载一个服务器端代码示例,以便使用 FCM v1 API 向您的应用发送消息。此代码会加载 API 凭据(下一部分中介绍),以生成访问令牌。然后,它会使用 FCM 主题消息传递向您的应用发送消息。

  • 下载 GitHub 项目,导入起始服务器代码。“messaging”项目是一个基于 Gradle 的 Java 项目,依赖于 firebase-admin SDK,该 SDK 提供了发送消息的功能。

如需详细了解应用服务器应如何与 FCM 搭配使用,请参阅文档您的服务器环境和 FCM

4. 获取 v1 凭据

FCM HTTP v1 API 根据 OAuth2 安全模型使用短期有效的访问令牌。与 FCM 旧版 API 中使用的静态 API 密钥相比,短期有效的访问令牌不太容易出现凭据泄露风险。本部分详细介绍了为生成用于调用 API 的访问令牌而创建凭据的步骤。

  1. 设置 Firebase 服务账号,以便 Firebase Admin SDK 授权对 FCM API 的调用。在 Firebase 控制台中打开项目设置,然后选择服务账号标签页。点击生成新的私钥以下载配置代码段。经过剪裁的屏幕截图,突出显示了“项目设置”页面“服务账号”组件的 Admin SDK 配置代码段
  2. 在下载的 GitHub 项目中,将下载的文件重命名为 service-account.json,然后将其复制到项目的 messaging/ 路径。
  3. Messaging.java 类中的 getAccessToken() 方法(如下所示)会生成一个有效期为 1 小时的 OAuth2 令牌。
private static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials.fromStream(new FileInputStream("service-account.json")).createScoped(Arrays.asList(SCOPES));
  googleCredentials.refresh();
  return googleCredentials.getAccessToken().getTokenValue();
}
  1. 更改 main 方法,并添加以下代码行:
public static void main(String[] args) throws IOException {
  System.out.println(getAccessToken());
  ...
}
  1. 在终端中前往 messaging/ 项目目录,然后输入以下命令:
./gradlew run -Pmessage=common-message

输出 OAuth2 令牌

如需了解详情,请参阅向发送请求提供授权

5. 使用 REST API 发送消息

现在,您可以通过 HTTP v1 API 发送消息了。请按以下步骤操作:

  • 如需将访问令牌添加到 HTTP 请求标头中:
  • Authorization: Bearer <access_token> 格式将令牌添加为 Authorization 标头的值
  • 使用 curl 向 FCM v1 API 发出 HTTP 请求:
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $OAuth2_token" -H "X-GFE-SSL: yes" -d  "{\"message\": {\"topic\": \"$topic_name\", \"notification\": {\"title\": \"breaking news\", \"body\": \"This is breaking news\"}}}" https://fcm.googleapis.com/v1/projects/[PROJECT_NAME]/messages:send

上面的 $topic_name 可在 Firebase 项目和 Android 应用设置中提及的 Android 应用代码中找到。默认情况下为 "weather"

  • 消息成功传送后,屏幕上应该会弹出一条通知,如下图所示:

54ae84ece22202cd.png

6. 总结

恭喜!您已成功完成此 Codelab,并完成以下操作:

  • 设置 Firebase 项目
  • 将 Firebase 与 Android 应用集成
  • 为 FCM HTTP v1 API 创建凭据
  • 通过 FCM HTTP v1 API 向应用发送消息

要探索 FCM 提供的高级功能,以下参考文档很有用: