未经授权的错误401 GCM错误

Cec*_*uez 2 php push-notification ios google-cloud-messaging

请注意,由于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);
Run Code Online (Sandbox Code Playgroud)

我目前正在使用不受限制的密钥进行测试:

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.
Run Code Online (Sandbox Code Playgroud)

据我所知,这应该是白名单一切,不应该吗?几年前有一些关于如何将服务器列入白名单的答案,但这似乎是针对API的旧接口/设置.

可能导致此问题的原因是什么?

AL.*_*AL. 5

更新:GCM文档中现在有一个明显的说明:

从2016年9月开始,只能使用"设置"面板的" 云消息传递"选项卡在Firebase控制台中创建新的服务器密钥.可以在Firebase控制台中导入需要创建新服务器密钥的现有项目,而不会影响其现有配置.


更新:似乎从GCM迁移到FCM修复了401 Unauthorized Error的问题.

如果您刚刚开始使用GCM,而不是在Google Developers Console中创建项目,请在Firebase控制台中执行此操作.创建项目后,只需使用自动生成的服务器密钥.以下是查找服务器密钥的步骤:

  1. 转到Firebase控制台并单击CREATE NEW PROJECT.
  2. 填写您想要的项目名称并选择您的国家/地区.在此之后,新项目应该是活跃的.
  3. 然后在左侧面板上,单击齿轮按钮并选择" 项目设置".
  4. 然后转到Cloud-Messaging选项卡.

对于旧的GCM项目,您只需将项目导入Firebase控制台:

  1. 转到Firebase控制台并单击IMPORT PROJECT.
  2. 选择要导入的项目和您所在的国家/地区.
  3. 点击ADD FIREBASE.在此之后,新项目应该是活跃的.
  4. 然后在左侧面板上,单击齿轮按钮并选择" 项目设置".
  5. 然后转到Cloud-Messaging选项卡.

这几天我一直看到很多这种担忧.这似乎是不受限制的键返回401错误,这可能是因为他们被强制要求所有API密钥(安全性,你看到警告).

因此,我通常建议使用IP地址限制(因为这是针对GCM,它应该是服务器密钥)并添加您的服务器IP地址.在这里看到我的答案.