GCM的API密钥突然无效了?出现未经授权的错误(401)。

30

我为我的安卓应用程序创建了一个GCM推送通知的API密钥。过去两天里,GCM服务器在PHP中返回未经授权(401)的响应。

安卓API密钥无效/过期的原因是什么?还是说GCM已经废弃了安卓API密钥?

我仍然没有得到关于为什么安卓API密钥无效的合适解释?大多数人更喜欢使用服务器密钥而不是安卓API密钥来进行GCM,但没有说明为什么不使用安卓API密钥。

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


你在 PHP 脚本中更新了必要的凭据吗?你在 Google 开发者控制台中包含了你的包名吗? - Swaminathan V
@kumar,我更新了我的答案。看看吧。如果你在寻找官方原因,目前似乎还没有公开披露的。 - AL.
嗨@kumar,我今天也遇到了一个类似的应用问题。自从2年以来一直都运行良好,但突然在周五开始收到了相同的401未授权错误。已经尝试重新生成服务器密钥,但没有成功。你设法解决了吗? - Shubhral
你只需要删除那个服务器密钥并创建新的服务器密钥。现在尝试一下。 - kumar
1个回答

64
更新:所使用的术语已经回到服务器密钥

最近,有一个新的Firebase云消息传递令牌(FCM令牌)正在推出。您可以在Firebase控制台的Cloud Messaging标签中看到它。


更新: GCM文档现在有一个可见的提示,内容如下:

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


更新: 迁移至 FCM 似乎也可以解决 401 未授权错误的问题。

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

  1. 前往 Firebase 控制台 并单击 创建新项目
  2. 填写所需的项目名称并选择所在国家/地区。完成后,新项目应处于活动状态。
  3. 然后在左侧面板上,单击 齿轮按钮 并选择 项目设置
  4. 接下来前往 云消息传递选项卡

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

  1. 前往Firebase控制台,点击导入项目
  2. 选择要导入的项目和所在国家。
  3. 点击添加Firebase。这样,新项目就会激活。
  4. 然后,在左侧面板上,点击齿轮按钮并选择项目设置
  5. 接着进入云消息传递标签页

由于某些原因,现在只有服务器密钥可以使用GCM。Android密钥不是唯一一个似乎无效的,所有其他客户端API密钥(浏览器,iOS,Android)也是如此。


当涉及服务器密钥的描述时:

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

使用服务器密钥是合理的,因为您正在服务器上使用API密钥,并且它正在与GCM连接服务器一起工作。

如果您将FCM文档GCM文档(在凭据下)进行比较,您会发现在GCM中,只规定了API密钥,而在FCM中,它已经指定了服务器密钥。好吧,FCM是GCM的新版本,也许这与此有关?我不太确定,但我想您明白我的意思。

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


默认情况下,在经过配置您的API项目步骤后,将生成服务器API密钥(我通过选择Android应用程序进行了测试)。 也是如此。每当我创建一个新项目时,它只会自动生成服务器密钥。
希望将来能有解释。
我会添加如何创建服务器密钥的步骤,以防其他人感到困惑或新手不确定。
  1. 前往Google Developers Console
  2. 在左侧窗格中,点击凭据
  3. 在凭据选项卡下,单击创建凭据
  4. 选择API密钥

---更新开发者控制台在此处削减了步骤---

  1. 选择服务器密钥
  2. 填写详细信息。
  3. 单击创建

此时应该可以使用服务器密钥。


更新:似乎最近在生成API密钥时有了一些变化。它与我上面提到的第4步相同。但是,在您选择API密钥之后,它将直接创建一个API密钥,而不会询问密钥类型(服务器、Android、浏览器、iOS)。它只允许您设置一些限制,这取决于您要生成哪种API密钥。
更新: 当创建一个没有限制的 API 密钥时,会显示一个警告(感叹号)表示您的 API 密钥存在漏洞,因此强烈建议您为 API 密钥添加限制。一个帖子曾经遇到了这个问题,添加了限制后问题得到了解决。

1
谢谢。我使用MixPanel进行推送通知,但是他们的系统不接受新的“无限制”密钥。 - peterept
1
@YuDroid 看起来应该可以工作。在这里查看:(https://dev59.com/iprga4cB1Zd3GeqPtNsV#39565070)。只要它能正常工作就好了。干杯 :) - AL.
4
最终,我的Android应用程序现在可以正常工作了,而无需进行任何代码更改。我所做的只是将现有的GCM项目导入到FCM(Firebase云消息传递)中。当我在FCM中检查项目设置时,它生成了“服务器密钥”。我将此“服务器密钥”上传到我的后端服务器(基于C#),然后就可以发送推送通知了。谢谢你的时间和考虑。 - YuDroid
1
我尝试导入现有的项目,但是旧版服务器密钥无法使用。所有其他旧版密钥都能正常工作。有什么想法为什么会这样? - Awani
1
老兄,你太棒了!只需更改 API 密钥就可以在 C# 上工作了! - agustinm20
显示剩余24条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接