GCM http 401授权错误

时间:2013-12-11 14:15:01

标签: android push-notification google-cloud-messaging http-status-code-401

当我的后端服务器向GCM服务器发送发布请求时,我收到HTTP 401的授权错误。

我按照这里描述的步骤进行了操作:

http://developer.android.com/google/gcm/http.html#auth_error

>> api_key=AIzaSyDEy3...

>> curl --header "Authorization: key=$api_key" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send  -d "{\"registration_id\":\"ABC\"}"

我明白了:

<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>

在故障排除中说:

Authentication Error
The sender account that you're trying to use to send a message couldn't be authenticated. Possible causes are:
    1. Authorization header missing or with invalid syntax.
    2. Invalid project number sent as key.
    3. Key valid but with GCM service disabled.
    4. Request originated from a server not whitelisted in the Server Key IPs.

我对此有疑问:

  1. 卷曲请求中的标题是否正确?
  2. 他们的意思是“api_key”(AIzaSy ......)或项目编号如8305134 ....?
  3. 如何将服务器密钥IP列入白名单?
  4. 如果我正在运行curl命令,是否必须将计算机的IP地址列入白名单?

14 个答案:

答案 0 :(得分:28)

  

他们的意思是“api_key”(AIzaSy ......)或项目编号如8305134 ......?

它表示应在curl脚本中添加的服务器密钥。项目编号不应用于在服务器端发送消息。

要创建新的服务器密钥,请执行以下步骤

  • 转到https://cloud.google.com/console/project
  • 点击您的项目
  • 转到 API&amp;左侧面板上的身份验证
  • 在左侧面板的子菜单中选择凭据
  • 公开API访问下,点击“创建新密钥
  • 选择“服务器”
  • 在下一个对话框中,指定列入白名单的IP(如果有)。留空,请求将来自任何IP
  • 点击创建
  • 您会发现新的服务器密钥是在“公共API访问
  • 下创建的

此密钥用于在服务器端的脚本中发送消息。

  

如何将服务器密钥IP列入白名单?

您可以在创建服务器密钥时将其列入白名单。

  

如果我正在运行curl命令,是否必须将计算机的IP地址列入白名单?

出于测试目的,您不必指定IP。出于商业目的,您可能想要。

使用入门指南中所述,

警告将IP设置为 0.0.0.0/0 将允许所有IPv4地址,但不允许IPv6。

答案 1 :(得分:19)

<强>更新

Google已更改控制台,现在您必须:

  • 转到https://console.developers.google.com
  • 选择您的项目(顶部的下拉列表)
  • 在左侧面板
  • 中的菜单中选择概述
  • 选择移动API 标题
  • 下的 Google Cloud Messaging
  • 点击启用按钮
  • 然后您必须创建凭据

<强> DEPRECATED

我遇到了同样的问题...然后我意识到我必须添加 Google Cloud Messaging for Android

  • 转到https://cloud.google.com/console/project
  • 点击您的项目
  • 转到 API&amp;左侧面板上的身份验证
  • 在左侧面板的子菜单中选择 API
  • 搜索适用于Android的Google Cloud Messaging(或/和Chrome)并将其打开

希望它可以帮到你!

答案 2 :(得分:16)

我使用服务器密钥而不是API密钥解决了这个错误。您可以通过单击齿轮并单击“项目设置”从Firebase控制台获取服务器密钥,然后转到显示Cloud Messaging的选项卡并获取服务器密钥,正常服务器密钥和旧服务器密钥都将起作用。 / p>

这适用于Firebase和GCM,因此我们无需单独声明两个密钥。

答案 3 :(得分:11)

终于找到了我的问题

  

我像这样Authorization:[Api key]

制作了HTTP授权标题      

解决方案

     

我在Authorization标题中缺少'key ='+ [你的Api密钥],

所以完整的HTTP标头将是

  

Authorization:key=Apikey

答案 4 :(得分:9)

我遇到了同样的问题。我使用的是 Android Key ,如说明中所述 http://developer.android.com/google/gcm/gs.html 但实际上我必须使用服务器密钥从我的Fiddler窗口和PushSharp示例中进行身份验证。

答案 5 :(得分:2)

  1. 我不知道curl命令的语法,但您指定为--header "key: value"的一个标题而另一个标题为--header key:"value"似乎很奇怪。也许其中一个是不正确的。此外,您应将registration_id:ABC更改为"{\"registration_ids\":[\"ABC\"]}"

  2. 他们指的是API密钥。

  3. 如果您在创建API密钥时未定义白名单IP列表,则默认情况下应将其列为白名单。

答案 6 :(得分:2)

我有同样的问题。我做的是:

  1. 清除将自动设置为任意IP的IP白名单。
  2. 重新生成服务器密钥并使用新生成的密钥。

答案 7 :(得分:2)

如果您最近尝试在GCM中创建新项目并添加服务器密钥,则无论如何都不会成功授权,因为Google停止授权新创建的服务器密钥以推广Firebase云消息传递。目前,创建新密钥的唯一选择是首先将现有项目迁移到Firebase here

答案 8 :(得分:2)

如果错误401:必须在FCM中导入GCM才能工作 然后可以在中找到服务器和发件人ID https://console.firebase.google.com/project/my_projectID/settings/cloudmessaging

答案 9 :(得分:0)

如果API密钥不匹配,则会发生未经授权的问题。 清除服务器密钥并重新生成新密钥。在服务器端编码中使用服务器API密钥。并正确使用android客户端中的发件人ID

答案 10 :(得分:0)

问题与授权有关,但是当我尝试以旧方式做事时,我遇到了这个错误, 我知道这是一个老问题,但让我把50美分放在上面。 首先,镇上有一个名为&#34; Firebase Cloud Messaging FCM&#34;的新孩子。请允许我引用谷歌:

  

FCM是Firebase品牌下的新版GCM。它继承了   GCM的核心基础架构,带有用于制作云消息传递的新SDK   发展更容易。

     

升级到FCM SDK的好处包括:

     

更简单的客户端开发。你不再需要自己编写   注册或订阅重试逻辑。一个开箱即用的   通知解决方案您可以使用Firebase通知,a   带有Web控制台的无服务器通知解决方案,可让任何人   根据Firebase向特定目标用户发送通知   分析见解。    More information about FCM   Configuration For android studio

我希望这可以帮助那些试图以旧方式做事的人

答案 11 :(得分:0)

要使用Firestore,您应该使用Web API key firebase控制台为您提供,您可以在以下位置找到 https://console.firebase.google.com/project/<yourProjectName>/settings/general/<yourAppPckageName>

但是,要使用Firebase向您的移动设备客户端推送通知,您应该使用Server key开发者控制台为您提供,您可以在以下位置找到 https://console.developers.google.com/apis/credentials?project=<yourProjectName>

答案 12 :(得分:-1)

以上的事情都完成了然后检查curl init操作的功能
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 ); 如果不包含,则包括或不包含功能

答案 13 :(得分:-1)

我有同样的问题。我正在做的是,代替API密钥,我发送消息而不是消息,我发送API密钥。只要检查你是否犯了同样的错误。