我应该使用哪种Bearer令牌进行Firebase云消息传递测试?

55

我正在尝试使用Postman通过Firebase Cloud Messaging发送测试通知。我将发送POST请求到以下URL:

https://fcm.googleapis.com/v1/projects/[my project name]/messages:send
在Postman中,授权选项卡设置为"无授权",我的标头选项卡如下所示。
Content-Type: application/json
Authorization: Bearer [server key]
在我的Firebase项目的“设置”区域的“云消息传递”选项卡中,[server key] 是新生成的服务器密钥。我一直在收到此错误响应。
"error": {
    "code": 401,
    "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "status": "UNAUTHENTICATED"
}

根据我所了解的,我正在使用正确的令牌,但似乎谷歌并不认同。为了避免出现此错误,我应该如何设置Authorization头?


尝试在您的服务器密钥前加上“key =”。我在这里有一个答案,展示了使用Postman发送时的逐步指南。 - AL.
我发现这个方法可行,但只适用于遗留API https://fcm.googleapis.com/fcm/send。我不太愿意使用遗留API,而不是需要用户oAuth令牌的V2 API。虽然我正在使用Firebase身份验证,但用户的令牌并不容易获得和保持最新(尽管这看起来很傻)。感谢您的指引。 - sonicblis
你最终解决了这个问题吗,@sonicblis? - C3332
5个回答

95

获取身份验证Bearer的步骤:

  1. 进入Google OAuth Playground:https://developers.google.com/oauthplayground
  2. 在“输入自己的作用域”中,针对FCM,请使用此URL:https://www.googleapis.com/auth/firebase.messaging
  3. 点击“授权API”。
  4. 选择正确的用户进行授权并允许访问。
  5. 在“步骤2:交换授权代码以获取令牌”中,点击“交换授权代码以获取令牌”。
  6. Access token即为您的Bearer

使用Postman发送FCM的步骤:

  1. 要发送的URL:https://fcm.googleapis.com/v1/projects/projectid-34543/messages:send
  2. 请求类型:POST
  3. Headers:Content-Type -> application/json & Authorization -> Bearer
  4. 在Body部分输入带有正确设备令牌的APS负载。
  5. 点击发送。

enter image description here

如果您要使用cURL发送数据通知:

curl --location --request POST 'https://fcm.googleapis.com/v1/projects/your-project-id/messages:send' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer your-access-token-*****-wqewe' \
--data-raw '{
    "message": {
        "token": "device-token-qwfqwee-***-qefwe",
        "data": {
            "Key1": "val1",
            "Key2": "val2"
        }
    }
}'

5
这个 GIF 图片真让人难以理解。 - Muhammad Asyraf
2
如何以编程方式(在后端)获取代码? - morfair
1
@Ramis 感谢。我得到了一个访问令牌。这个令牌是永远的吗? - BIS Tech
1
非常感谢,我花了很长时间才找到如何生成令牌。提供的步骤完全有效。 - Abner
1
非常详细的回答!谢谢。 - Rohit Parte
显示剩余5条评论

16

在 Postman 中生成新的访问令牌。

首先,请确保您已在 Google 开发者控制台中启用了 FCM API。 然后进入Google开发人员控制台->API和服务->凭据。查看“OAuth 2.0客户端ID”部分。列表中应至少有一项。将其下载为json文件。

在Postman中打开“授权”选项卡,选择类型=“OAuth 2.0”,然后单击“获取新的访问令牌”。出现对话框。

字段:

令牌名称-输入所需名称

授权类型=授权代码

回调URL=从下载的json中获取的redirect_uris

认证URL=auth_uri

访问令牌URL=token_uri

客户端ID=client_id

客户端秘密=client_secret

范围="https://www.googleapis.com/auth/firebase.messaging"

状态-留空

客户端身份验证=default,发送基本身份验证标头

单击“请求令牌”,完成。


那对我来说可行!而且你还需要激活FCM API。 - Luis Abarca
1
不再工作了。出现“浏览器不安全”的提示。 - Ramis
工作正常。但需要一个通过任何API来构建的解决方案。 - Sanjay Kumar
1
这个解决方案和oauthplayground解决方案都对我有用,但我真的更喜欢这个,因为它可以通过Postman更好地集成! - Lucas Sousa

12

Bearer Token是使用Firebase服务帐户获取OAuth访问令牌的结果。

  1. 获取Firebase服务帐户密钥。
    前往您的firebase控制台 > 设置 > 服务帐户。
    如果您在Firebase Admin SDK上,请生成新的私钥。

  2. 使用服务帐户密钥进行身份验证并获取承载令牌。
    请参阅此处如何在Node、Python或Java中执行此操作:https://firebase.google.com/docs/cloud-messaging/auth-server

因此,在Java中,可以像这样获取令牌:

  private static final String SCOPES = "https://www.googleapis.com/auth/firebase.messaging";

  public static void main(String[] args) throws IOException {
    System.out.println(getAccessToken());
  }

  private static String getAccessToken() throws IOException {
    GoogleCredential googleCredential = GoogleCredential
        .fromStream(new FileInputStream("service-account.json"))
        .createScoped(Arrays.asList(SCOPES));
    googleCredential.refreshToken();
    return googleCredential.getAccessToken();
  }
  1. 现在,您终于可以使用 FCM 发送测试通知。

Postman 代码:

POST /v1/projects/[projectId]/messages:send HTTP/1.1
Host: fcm.googleapis.com
Content-Type: application/json
Authorization: Bearer access_token_you_just_got

{
  "message":{
    "token" : "token_from_firebase.messaging().getToken()_inside_browser",
    "notification" : {
      "body" : "This is an FCM notification message!",
      "title" : "FCM Message"
      }
   }
}

1
如何在没有Admin SDK的情况下获取Bearer令牌? - morfair
1
有没有一种方法可以在不需要引用Google.Apis.Auth Nuget包的情况下获取令牌? - thomasgalliker

5
为了测试推送通知,您可以使用Google开发者OAuth 2.0 Playground生成一个访问令牌。
您甚至可以使用Google开发者OAuth 2.0 Playground来发送测试推送通知。或者如果您愿意,也可以使用Postman /终端(curl命令)进行测试。
请参考我编写的此处详细的步骤。 enter image description here 注意:在Endpoint中,您需要使用“项目ID”而不是“项目名称”。获取项目ID的步骤也在上面的链接中说明。

访问令牌是否过期? - Kim Carlo
@KimCarlo 是的,它会过期。如果您注意到屏幕截图,它会显示(“访问令牌将在3586秒后过期”)。但是,您可以单击“在令牌过期之前自动刷新令牌”或手动执行“刷新访问令牌”。 - Apoorv
1
这是一个非常好的答案,迄今为止最详尽。谢谢! - Fingolfin

3
你应该绝对使用Google-OAuth2.0,可以按照提供的链接中描述的步骤生成。

你可以在这里找到详细的步骤,我为类似问题提供了答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接