谷歌GCM中的HTTP响应码401

10

尽管我的服务器和浏览器应用程序的 API 密钥都是有效的,但我仍然遇到了以下异常。 我使用 curl 进行了检查。 我以 UTF-8 和 JSON 格式发送 GCM 请求。 从公司网络外测试。

java.io.IOException: Server returned HTTP response code: 401 for URL: https://android.googleapis.com/gcm/send
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1345)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1339)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:993)
        at java.net.URLConnection.getContent(URLConnection.java:688)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getContent(HttpsURLConnectionImpl.java:406)
        at gcm1.MessageUtil.sendMessage(MessageUtil.java:58)

我能知道这个问题的原因和解决方案吗?


对于那些正在浏览的人,如果您突然开始遇到此错误而没有进行任何特定更改(服务器密钥仍相同),则可能需要将项目导入Firebase。请参见我的答案此处 - AL.
3个回答

7
以下是使用GCM时401错误的可能原因:
您正在尝试用于发送消息的发送者帐户无法得到验证。可能的原因是:
- 授权标头缺失或语法无效。 - 作为密钥发送的项目ID无效。 - 密钥有效,但GCM服务已禁用。 - 请求起源于未列入服务器密钥IP白名单中的服务器。
请检查您在Authorization标头中发送的令牌是否是与您的项目相关联的正确API密钥。
来源:https://developers.google.com/cloud-messaging/http-server-ref#error-codes

我使用curl检查了我的API密钥,它正常工作。它以JSON格式返回带有success:1的响应。服务器也已在服务器密钥IP白名单中。 - chako
2
让我困惑的是,谷歌要求在“授权”标头中以“key=”为前缀添加API密钥。这对我来说毫无意义(它已经在标头字段中了;加上“key=”是多余的),但一旦我添加了它,问题就解决了。 - aroth
更新链接:https://developers.google.com/cloud-messaging/http-server-ref#error-codes - Jason

0

请按照以下说明操作,这可能会对您有所帮助。

更新:从GCM迁移到FCM似乎也可以解决401未经授权的错误。

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

  1. 转到Firebase控制台,然后单击“创建新项目”。
  2. 填写所需的项目名称并选择所在国家/地区。完成此操作后,新项目应处于活动状态。
  3. 然后,在左侧面板上,单击齿轮按钮,然后选择“项目设置”。
  4. 接着进入Cloud-Messaging选项卡。

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

  1. 前往Firebase控制台,点击“导入项目”。
  2. 选择要导入的项目和您所在的国家。
  3. 点击“添加Firebase”。完成后,新项目应该已经激活。
  4. 然后在左侧面板上,点击齿轮按钮并选择“项目设置”。
  5. 接着进入“云消息传递”选项卡。

0
在我的情况下,问题是我在数据存储中设置正确的 API 密钥后忘记重新部署。

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