在Firebase云消息传递中,我应该指定什么作为授权密钥?

6

你们能帮我(以及其他和我一样感到沮丧的人)理解Google Firebase的工作原理吗?文档非常令人困惑,让我感到很傻。

事情是这样的。我只是想向我的Cordova应用程序的用户发送推送消息,通知他们有更新或者其他信息。在过去的好时光(也许几周前),它被简单地称为推送消息。现在有了Firebase这个东西,他们改变并重命名了一切。我想我现在需要的是通知,但也有云消息,我真的看不出确切的区别。

然后术语上存在完全混乱。显然有一个https API来发送通知,但文档很差。有一些网站解释了它,但它们似乎在术语上没有达成共识。有些人提到“API密钥”,有些人提到“身份验证密钥”,Google本身称其为“授权密钥”,但当我查看控制台上的项目设置时,我看到一个“服务器密钥”和一个“应用程序ID”,而google_services.json文件包含一个“私钥ID”。所以有相当多的疑问。

有人能澄清我应该在这里提供什么吗?这是如何向Firebase API发出POST请求的:

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA  <-- WHAT IS THIS?

{ "data": {
    "score": "5x1",
    "time": "15:10"
 },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..." <-- AND THIS?
}

什么属于“授权”?如果我想发送通知给所有用户,"to"的值应该是什么,如果我想针对特定群体怎么办?(一开始,只要它能到达每个设备,我就很高兴。)是否有关于这些参数的良好文档?
此外,看起来 Google 假定每个人都在使用 Java,并且仅提供 Java 示例。至少我没有找到适用于 PHP、Node.js 或普通 JavaScript 的示例。有许多我不需要的函数示例。
更新:我刚发现“授权”应该是 Firebase 控制台下我的项目云消息选项卡中找到的“服务密钥”。 (好事他们没有把它藏得太深。)尽管如此,如果我用 cURL 从 PHP 发送 POST,则返回空响应和 HTTP 代码 0。
1个回答

18

好的,我自己解决了,并感觉自己不再像个白痴了。希望那些仍然觉得困惑的人会发现这很有用。

“授权”值应该是在Firebase控制台下我的项目的云消息选项卡中找到的“服务器密钥”。

“to”参数是必需的。如果省略它,服务器将响应一个简单的“to”。无论如何,它都会以漂亮的JSON格式响应。

如果您想向所有设备发送消息,则应指定:

"to": "/topics/all"

如果成功,服务器的响应只有这个:

{"message_id":4988221490411655075}

如果发生任何错误,它看起来像这样:

{"multicast_id":5691752204334485119,
 "success":0,
 "failure":1,
 "canonical_ids":0,
 "results":[{
               "error":"MissingRegistration"
            }]
}

这里解释了参数和返回值:

https://firebase.google.com/docs/cloud-messaging/http-server-ref

Firebase控制台仅保留从控制台本身发送的消息。

对于Cordova,我正在使用这个简单的插件,它运行良好:

https://www.npmjs.com/package/cordova-plugin-fcm

以下是一个格式良好的JSON请求,可在PHP中使用cURL发送(也已包含):

$json_data = '{ "data": { 
                  "price": "1000",
                  "currency": "USD" 
                },
                "notification": {
                  "title": "Hey you got a message",
                  "body": "Your mother stil loves you",
                  "sound": "default",
                  "click_action": "FCM_PLUGIN_ACTIVITY",
                  "icon": "icon_name"
                },
                "to": "/topics/all",
                "priority": "high"
              }';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
                                            'Content-Type: application/json',                                                                                
                                            'Content-Length: '.strlen($json_data),
                                            'Authorization:key=AIzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'  
                                          ));           
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$output = curl_exec($ch);
curl_close($ch);

您先生是一个救命恩人 :) - Kushan
这真是太棒了,非常感谢。我有一些疑问,关于如何获取服务器密钥。所以,在应用程序中硬编码密钥是一个好主意吗?还是我们可以通过编程方式获取值? - Tapas Mukherjee
这只是一个字符串,你可以从任何你想要的地方获取它。显然,这里只是一个例子,我实际上将它放入了一个全局变量中。 - Tamás Polgár

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