未经授权的gcm

时间:2016-09-14 15:44:11

标签: google-chrome service-worker

#include_next

这是我的要求, 我试图从我的cmd发送这个, 使用我在谷歌控制台创建的api密钥,我的端点为registration_ids。

但这就是我得到的:

CURL --header "Authorization: key=XXXXXXXXX" --header "Content-Type: application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"XXXXXXXX\"]}"

任何想法? thx:)

2 个答案:

答案 0 :(得分:0)

导航至https://console.developers.google.com/apis/credentials?project=<project-name>

然后选择您创建的服务器密钥。在页面底部,您可以添加列入白名单的IP /范围。

答案 1 :(得分:0)

您获得401 Unauthorized因为GCM仅接受来自基于HTTPS的主机的请求,而本地控制台不是这样。

验证这一点的最简单方法(如果您还没有基于HTTPS的网站)是:

第1阶段 - 获取启用HTTPS的网站

  1. 在CloudFlare上创建帐户
  2. 将您的域名的DNS更改为CloudFlare&#39;
  3. 在CloudFlare控制台中输入您的服务器IP
  4. 启用免费HTTPS(并禁用缓存 - 有时可能会很棘手)
  5. 现在,您网站的流量将通过CloudFlare重定向。 从您的客户到CloudFlare的流量将被加密,从CloudFlare到您的服务器的流量不会被激活。

    虽然它不是100%安全,但它可以保护最常见的攻击媒介 - 恶意互联网提供商等,并且只需很少的努力就可以获得免费的服务工作者就绪网站。

    如果您需要自己的证书,可以使用Let's Encrypt

    第2阶段 - 将GCM发件人放在您的HTTPS服务器上

    我在PHP中有一些示例代码:

    <?
    
    function sendPushNotification($data, $ids)
    {
        echo("<br><br><b>Sending notifications...</b>");
        // Insert real GCM API key from the Google APIs Console
        $apiKey = 'AIza...';
        // Set POST request body
        $post = array(
          'registration_ids'  => $ids,
          'data'              => $data,
        );
        // Set CURL request headers
        $headers = array(
          'Authorization: key=' . $apiKey,
          'Content-Type: application/json'
        );
        // Initialize curl handle
        $ch = curl_init();
    
        // Set URL to GCM push endpoint
        curl_setopt($ch, CURLOPT_URL, 'https://gcm-http.googleapis.com/gcm/send');
        // Set request method to POST
        curl_setopt($ch, CURLOPT_POST, true);
        // Set custom request headers
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        // Get the response back as string instead of printing it
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        // Set JSON post data
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));
        // Actually send the request
        $result = curl_exec($ch);
        // Handle errors
        if (curl_errno($ch))
        {
          echo 'GCM error: ' . curl_error($ch);
        }
        // Close curl handle
        curl_close($ch);
        // Debug GCM response
        echo $result;
    }
    
    
    $data = array('message' => 'JAAAREEEEK!');
    // Please note that currently push payload is not supported. However if you're reading this answer from the future it might work
    
    // The recipient registration tokens for this notification
    // https://developer.android.com/google/gcm/
    $ids = ['registrationid1','registrationid2']
    
    // Send push notification via Google Cloud Messaging
    sendPushNotification($data, $ids);
    

    我有完全相同的问题,这个解决方案解决了它。如果您还有其他问题,请给我一个大喊。