当前位置: 首页 > 知识库问答 >
问题:

如何排除Android GCM 401错误?

洪子晋
2023-03-14

我在尝试连接到Google Cloud Message Server时收到许多< code>401未授权错误。

我们的代码在测试服务器上运行了一段时间,但是在生产服务器上却失败了几次。

API键工作正常,推送通知(最终)到达,但同时我得到了许多< code>401错误。

我已经在控制台上验证了服务器IP地址在白名单上:

在遵循Google故障排除指南时,我得到了令人惊讶的结果:

me@myserver:~$ :curl --header "Authorization: key=AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFFU" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send  -d "{\"registration_ids\":[\"ABC\"]}"
<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
me@myserver:~$ curl --header "Authorization: key=AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFFU" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send  -d "{\"registration_ids\":[\"ABC\"]}"
{"multicast_id":7560936933053964665,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
me@myserver:~$ curl --header "Authorization: key=AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFFU" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send  -d "{\"registration_ids\":[\"ABC\"]}"
<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>

有时,同一个< code>curl命令可以工作,有时不工作,控制台和命令行都没有任何改变...因为有时它会工作,所以我认为密钥没问题(我已经反复检查了几次密钥和允许的IP)。

我已经检查了所有的堆栈溢出问题并测试了所有的建议,但即使从白名单中删除了所有的IP(以允许来自任何IP的请求),行为仍然是一样的,有时它有效,有时它不起作用

我检查过的一些参考资料:

  • GCM 与 PHP (谷歌云消息传递)
  • 授权错误
  • GCM 服务中存在不可靠的 401 错误
  • GCM 发送消息失败,出现 401(未经授权)

任何关于接下来会发生什么的建议都将非常感谢。

共有3个答案

阎阎宝
2023-03-14

可能会出现IPv6用于连接,而仅允许IPv4的情况。确保您有“任何允许的IP ”,而不仅仅是IPv4 0.0.0.0/0。

吴开宇
2023-03-14

我已经通过在同一项目下创建新的API键解决了我的问题。在此之后

转到Google开发人员控制台,然后选择项目凭据-

创建Api密钥后,可能需要5分钟才能工作

仇高韵
2023-03-14

经过多次检查并没有找到好的结果,我们唯一能给出的解决方案是使用新的API密钥创建一个新项目(第三个项目,因为我们之前已经做过了),这是第三次它起作用了。

 类似资料:
  • 我曾有意把检查程序执行和修复错误分割开来,但是当然,调试也意味着移除 bug。理想状况下,当你完美的发现了错误以及它的修复方法时,你会对代码有完美的理解,并且有一种顿悟(啊哈!)的感觉。但由于你的程序会经常使用其他不具有可视性的、没有一致性注释的系统(比如第三方库),所以完美是不可能的。在其他情况下,可能代码是如此的复杂以至于你的理解可能并不完美。 在修复 bug 时,你可能想要做最小的改变来修复

  • 我使用的是Ubuntu Linux 16、Gradle 2.10、Groovy 2.4.5和Java版本9。如果我不需要Gradle,我想把它除掉。我正在尝试从GitHub运行此程序。 这是代码的文本: 当我用 Groovy RecursiveMemoizationSpec.groovy 我收到以下错误: /groovy trampoline记忆规范/src/test/groovy/timezra

  • 我有一个Web服务,它是一个数字签名(验证pdf,签名pdf)我正在使用库bcpkix-jdk15on-1.54.jar,bcprov-jdk15on-1.54.jar,itextpdf-5.4.0.jar.和作为Weblogic 12c12.2.1.2应用服务器当我在本地测试服务时,一切正常,但当在服务器上测试时,服务返回:java.lang.ClassNotFoundException:org

  • 问题内容: 我的文件夹包含单元测试和功能测试。功能测试的类路径中有单词,而单元测试中没有。那么,如何仅运行单元测试? 非常感谢你。 PS :我知道很容易使用“包含”逻辑来选择测试。例如,仅在我的情况下运行功能测试,我可以简单地使用此功能。 但是,我不知道如何以简单的方式排除测试。 顺便说一句,我正在使用gradle 1.11。 问题答案: 任务的文档通过一个示例和所有内容对其进行了说明:

  • 问题内容: 我在表中有一个日期列。 我应该排除周末(星期六和星期日)。工作日的数据应单独显示。 如何在SQL中做到这一点? 问题答案: 您只需要添加以下 过滤器 : 您的查询如下所示: 例如(WITH子句仅用于构建测试用例),以下查询仅显示从到的工作日(即,不包括星期六和星期日): 有关详细示例,请参见生成日期,月份名称,星期编号,两个日期之间的天数

  • 我正在遵循Laravel文档来设置使用推送器的广播,它看起来很简单,但是我还没有得到它的工作,所以我一定是在路上的某个地方犯了一个错误。 以下是我所做的: 服务器端 我创建了一个,它实现了接口,并定义了方法。 我正在从我的一个API控制器引发事件: 我已经在我的文件中配置了推进器凭据。 客户端 我已经在客户端配置了Laravel Echo(通过angular Laravel Echo包),并将我的