GCM http 401 授权错误

Posted

技术标签:

【中文标题】GCM http 401 授权错误【英文标题】:GCM http 401 authorization error 【发布时间】:2013-12-29 13:30:49 【问题描述】:

当我的后端服务器向 GCM 服务器发送 post 请求时,我收到 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.

我对此有疑问:

    curl 请求中的标头是否正确? 它们是指“api_key”(AIzaSy…)还是像 8305134…这样的项目编号? 如何将我的服务器密钥 IP 列入白名单? 如果我正在运行 curl 命令,是否必须将我的计算机的 IP 地址列入白名单?

【问题讨论】:

参考这个***.com/a/21628030/1765530 对于刚刚浏览的其他人,如果您在没有进行任何特定更改(服务器密钥)仍然相同的情况下突然开始遇到此错误,您可能需要将您的项目导入 Firebase。看我的回答here。 【参考方案1】:

它们是指“api_key”(AIzaSy…)还是像 8305134…这样的项目编号?

这意味着应该在你的 curl 脚本中添加服务器密钥。项目编号不应用于服务器端发送消息。 要创建新的服务器密钥,请按照以下步骤操作,

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

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

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

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

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

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

警告将 IP 设置为 0.0.0.0/0(如 入门 指南中所述)将允许所有 IPv4 地址,但不允许 IPv6。

【讨论】:

我还必须同时激活 Chrome 和 Android Cloud Messaging API。 +1,谢谢@vijay-c 最初我在服务器中使用了 Android 应用程序 API 密钥。所以我得到了 401 未经授权的错误。只有从您的回答中,我才知道我们需要生成和使用 Server Application API Key 你能用console.cloud.google.com/iam-admin/projects的最新屏幕更新吗?好像被修改了,找不到指定的菜单!【参考方案2】:

更新:

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

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

已弃用

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

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

希望对你有帮助!

【讨论】:

它对我有用。我对 Parse.com 和它的推送通知机制有同样的问题。【参考方案3】:

我通过使用服务器密钥而不是 API 密钥解决了这个错误。您可以通过单击齿轮并单击项目设置从 Firebase 控制台获取服务器密钥,然后转到显示云消息传递的选项卡并获取服务器密钥,普通服务器密钥和旧服务器密钥都可以使用。

这适用于 Firebase 和 GCM,因此我们不需要分别声明两个键。

【讨论】:

【参考方案4】:

终于找到了我的问题

我制作了这样的 HTTP 授权标头Authorization:[Api key]

解决方案

我在授权标头中缺少 'key='+[Your Api key],

所以完整的 HTTP 标头将是

Authorization:key=Apikey

【讨论】:

【参考方案5】:

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

【讨论】:

完全正确,我也应该是Server Key 是的,它有效。太奇怪了,直到今天,我的 Android Key 在过去的几个月里仍然有效。 @QuanNguyen,我的安卓密钥过去也为我工作过。 @Vijay Vepakomma,你能告诉我 Android 与服务器密钥有什么区别吗? @user1324887 Android key 是应用用来发送通知给操作系统的,server key 是用来验证推送通知服务器的【参考方案6】:

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

    它们表示 API 密钥。

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

【讨论】:

一直在尝试部署和配置 GCM,您的答案是唯一对我有帮助的答案。基本上我一直在尝试使用 curl 命令进行测试,但我总是吐出“未经授权”。该页面是第一个给我有效回复的页面,非常感谢:)【参考方案7】:

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

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

【讨论】:

对我来说清除 ip 的工作列表。我不必重新生成我的服务器密钥。0.0.0.0/0 不起作用。我不知道他们为什么提到要在文档中添加它? GCM 如何知道请求来自我的桌面而不是任何实际的服务器。【参考方案8】:

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

FCM 是 Firebase 品牌下的新版 GCM。它继承 GCM 的核心基础设施,使用新的 SDK 来制作云消息传递 开发更容易。

升级到 FCM SDK 的好处包括:

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

我希望这对尝试以旧方式做事的人有所帮助

【讨论】:

【参考方案12】:

对于使用Firestore,您应该使用Web API keyfirebase 控制台为您提供,您可以在以下位置找到 https://console.firebase.google.com/project/&lt;yourProjectName&gt;/settings/general/&lt;yourAppPckageName&gt;.

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

【讨论】:

【参考方案13】:

上面的事情都做完了然后查看curl init操作函数 curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 ); 是否包含,如果不包含则包含函数

【讨论】:

以上是关于GCM http 401 授权错误的主要内容,如果未能解决你的问题,请参考以下文章

Google GCM 服务器返回未经授权的错误 401

GCM 服务器端 PHP - 未经授权的 401 错误

在 ASP.NET 中为 manifest.json GCM 推送通知获取未经授权的 401

http错误大全

常见网页代码错误

HTTP错误汇总(404302200……)