请注意,这个问题应该与其他类似名称的问题存在重大差异,因为过去几年API似乎发生了重大变化。
我正在尝试使用GCM向iOS设备发送推送通知。
我(我认为)大多是正确设置的。我有来自GCM的API密钥,我已经在Apple Developer上设置了我的SSL证书,并且我的设备正确地获得了注册ID。
我已经编写了一个小测试脚本来尝试测试它,并且我的结果中出现了401个未经授权的错误。这是我的代码:
define('API_ACCESS_KEY', '<API KEY HERE>');
$fields = array(
'to' => '<REG_ID HERE>',
'registration_ids' => '<REG_ID HERE>',
'notification' => array('body' => 'test', 'title' => 'Test'),
);
$headers = array(
'Authorization: key=' . API_ACCESS_KEY,
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gcm-http.googleapis.com/gcm/send');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
curl_close($ch);
我目前正在使用不受限制的密钥进行测试:
This key is unrestricted. To prevent unauthorized use and quota theft, restrict your key.
Key restriction lets you specify which web sites, IP addresses, or apps can use this key.
据我所知,这应该列入所有内容,不应该吗?几年前有一些关于如何将服务器列入白名单的答案,但这似乎是针对API的旧接口/设置。
可能导致此问题的原因是什么?
答案 0 :(得分:5)
更新:GCM docs中有一条明显的说明:
从2016年9月开始,只能使用“设置”面板的Cloud Messaging标签在Firebase控制台中创建新的服务器密钥。可以在Firebase console中导入需要创建新服务器密钥的现有项目,而不会影响其现有配置。
更新:似乎从GCM迁移到FCM 修复了401 Unauthorized Error的问题。
如果您刚刚开始使用GCM ,而不是在Google Developers Console中创建项目,请在Firebase控制台中执行此操作。创建项目后,只需使用自动生成的服务器密钥。以下是查找服务器密钥的步骤:
对于旧的GCM项目,您只需将项目导入Firebase控制台:
过去几天我一直看到很多这种担忧。似乎不受限制的密钥会返回401错误,这可能是因为它们强制执行所有API密钥的安全性(,您会看到警告)。
因此,我通常建议使用IP地址限制(因为这是针对GCM,它应该是服务器密钥)并添加您的服务器IP地址。 请参阅我的回答here。