GCM 的 API 密钥突然失效?未经授权的 (401) 错误

Posted

技术标签:

【中文标题】GCM 的 API 密钥突然失效?未经授权的 (401) 错误【英文标题】:API key for GCM is suddenly invalid? Unauthorized (401) error 【发布时间】:2016-10-13 20:14:14 【问题描述】:

我为我的 android 应用程序创建了一个用于 GCM 推送通知的 Android API 密钥。从过去两天开始,GCM 服务器在 php 中返回未经授权的 (401) 响应。

Android API 密钥无效/过期有什么原因吗?还是 GCM 已弃用 Android API 密钥?

我仍然没有得到关于为什么 Android API 密钥无效的正确解释?他们中的大多数人更喜欢服务器密钥而不是 GCM 的 Android API 密钥,但没有提及为什么不使用 Android API 密钥。

为什么不在 GCM 中使用 Android API Key? Android API 密钥有什么限制吗?或者如果通知消息超过每日限制,GCM 服务器是否会阻止通知/GCM 服务器使 Android API 密钥无效?

【问题讨论】:

您是否在 PHP 脚本中更新了必要的凭据?您是否在 Google 开发者控制台中包含了您的软件包名称? @kumar 我更新了我的答案。看看这个。如果您正在寻找官方原因,似乎还没有透露任何内容。 嗨@kumar,我今天的应用程序也遇到了类似的问题。它自 2 年以来一直运行良好,但突然从星期五开始,我开始收到相同的 401 未经授权的错误。也尝试过重新生成服务器密钥,但没有成功。你解决了吗? 您只需删除该服务器密钥并创建新的服务器密钥。现在试试吧 【参考方案1】:

更新:使用的术语回到服务器密钥

就在最近,现在推出了一个 Firebase 云消息传递令牌(FCM 令牌)。这在 Firebase 控制台的“云消息传递”选项卡中可见。


更新:现在GCM docs 中有一条可见的注释:

从 2016 年 9 月开始,只能使用“设置”面板的 Cloud Messaging 标签在 Firebase 控制台中创建新的服务器密钥。现有项目需要新建服务器密钥,可以在Firebase console中导入,不会影响现有配置。


更新从 GCM 迁移到 FCM 似乎也解决了 401 Unauthorized Error 的问题。

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

    转到您的Firebase Console 并点击创建新项目。 填写您想要的项目名称并选择您的国家。在此之后,新项目应该处于活动状态。 然后在左侧面板上,点击齿轮按钮并选择项目设置。 然后转到云消息选项卡

对于旧的 GCM 项目,您可以简单地将项目导入 Firebase 控制台:

    转到您的Firebase Console 并点击导入项目。 选择您要导入的项目和您所在的国家/地区。 单击添加 FIREBASE。在此之后,新项目应该处于活动状态。 然后在左侧面板上,点击齿轮按钮并选择项目设置。 然后转到云消息选项卡

由于某种原因,现在只有服务器密钥可用于 GCM。 Android 密钥并不是唯一一个似乎无效的密钥,所有其他客户端 API 密钥(浏览器、ios、Android)都是。


关于Server Key的描述:

如果您的应用程序在服务器上运行,请创建并使用服务器密钥。

使用服务器密钥是合乎逻辑的,因为您在服务器上使用 API 密钥,并且它与 GCM 连接服务器一起使用。

如果您比较 FCM docs 和 GCM docs(在 Credentials 下),您可以看到在 GCM 中,它只声明 API 密钥,而在 FCM ,它已经指定了一个服务器键。那么,FCM 是 GCM 的较新版本,可能与它有关吗?我不太确定,但我想你明白我在说什么。

更新:在 GCM 文档中,现在指明了服务器密钥。


默认情况下,经过Configure your API Project 步骤后,会生成一个服务器 API 密钥(我通过选择 Android 应用对其进行了测试)。 firebase-cloud-messaging 也是如此。每当我创建一个新项目时,它都会自动生成一个服务器密钥。

希望将来会有一个解释。


继续并添加有关如何创建服务器密钥的步骤。以防其他人感到困惑,或者新手不知道该怎么做。

    转到您的Google Developers Console 在左侧窗格中,单击 Credentials 在凭据选项卡下,单击 创建凭据 选择 API 密钥

---开发者控制台中的更新减少了这里的步骤---

    选择 服务器密钥 填写详细信息。 点击创建

届时服务器密钥应该可用。


更新:生成 API 密钥时似乎最近发生了变化。在我上面提到的第 4 步之前都是一样的。但是,选择 API Key 后,它会直接创建一个 API 密钥,而不会询问它是什么类型的密钥(服务器、Android、浏览器、iOS)。它只允许您设置一些可见的限制,具体取决于您要生成的 API 密钥。


更新:在创建无限制的 API 密钥时,它会显示一个通知(感叹号),表明您的 API 密钥易受攻击,这就是为什么它强烈建议供您为您的 API 密钥添加限制。一位post 遇到了这个问题,添加限制可以解决它。

【讨论】:

Server Key 不再是一个选项。所以我选择了no restrictions,API Key 说无效。 谢谢。我使用 MixPanel 进行推送通知 - 他们的系统不接受新的 no restrictions 键。 其他用户似乎也有这种问题,但谷歌没有答案。 groups.google.com/forum/#!topic/firebase-talk/qjCTWINQMNU @YuDroid 似乎应该可以。见here。只要它在工作。干杯。 :) @AL。所以最后我的 Android 应用程序现在可以正常工作而无需进行任何代码更改。我所做的只是将我现有的基于 GCM 的项目导入 FCM(Firebase 云消息传递)。当我检查 FCM 中的项目设置时,它生成了Server Key。我在我的后端服务器(基于 C#)上上传了这个 Server Key,我可以发送推送通知。干杯。感谢您的时间和考虑。

以上是关于GCM 的 API 密钥突然失效?未经授权的 (401) 错误的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Batch API 上的授权密钥和 GCM 发件人 ID

Google Cloud Messaging API - 未经授权

未经授权,此IP,站点或移动应用程序无法使用此API密钥

Node-Red Watson“未经授权的访问”但API密钥字段已填写