当我的后端服务器向GCM服务器发送发布请求时,我收到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.
我对此有疑问:
答案 0 :(得分:28)
他们的意思是“api_key”(AIzaSy ......)或项目编号如8305134 ......?
它表示应在curl脚本中添加的服务器密钥。项目编号不应用于在服务器端发送消息。
要创建新的服务器密钥,请执行以下步骤
此密钥用于在服务器端的脚本中发送消息。
如何将服务器密钥IP列入白名单?
您可以在创建服务器密钥时将其列入白名单。
如果我正在运行curl命令,是否必须将计算机的IP地址列入白名单?
出于测试目的,您不必指定IP。出于商业目的,您可能想要。
如使用入门指南中所述,警告将IP设置为 0.0.0.0/0 将允许所有IPv4地址,但不允许IPv6。
答案 1 :(得分:19)
<强>更新强>
Google已更改控制台,现在您必须:
<强> DEPRECATED 强>
我遇到了同样的问题...然后我意识到我必须添加 Google Cloud Messaging for Android 。
希望它可以帮到你!
答案 2 :(得分:16)
我使用服务器密钥而不是API密钥解决了这个错误。您可以通过单击齿轮并单击“项目设置”从Firebase控制台获取服务器密钥,然后转到显示Cloud Messaging的选项卡并获取服务器密钥,正常服务器密钥和旧服务器密钥都将起作用。 / p>
这适用于Firebase和GCM,因此我们无需单独声明两个密钥。
答案 3 :(得分:11)
终于找到了我的问题
我像这样
制作了HTTP授权标题Authorization:[Api key]
解决方案
我在Authorization标题中缺少'key ='+ [你的Api密钥],
所以完整的HTTP标头将是
Authorization:key=Apikey
答案 4 :(得分:9)
我遇到了同样的问题。我使用的是 Android Key ,如说明中所述 http://developer.android.com/google/gcm/gs.html 但实际上我必须使用服务器密钥从我的Fiddler窗口和PushSharp示例中进行身份验证。
答案 5 :(得分:2)
我不知道curl
命令的语法,但您指定为--header "key: value"
的一个标题而另一个标题为--header key:"value"
似乎很奇怪。也许其中一个是不正确的。此外,您应将registration_id:ABC
更改为"{\"registration_ids\":[\"ABC\"]}"
。
他们指的是API密钥。
如果您在创建API密钥时未定义白名单IP列表,则默认情况下应将其列为白名单。
答案 6 :(得分:2)
我有同样的问题。我做的是:
答案 7 :(得分:2)
如果您最近尝试在GCM中创建新项目并添加服务器密钥,则无论如何都不会成功授权,因为Google停止授权新创建的服务器密钥以推广Firebase云消息传递。目前,创建新密钥的唯一选择是首先将现有项目迁移到Firebase here。
答案 8 :(得分:2)
如果错误401:必须在FCM中导入GCM才能工作 然后可以在中找到服务器和发件人ID https://console.firebase.google.com/project/my_projectID/settings/cloudmessaging
答案 9 :(得分:0)
如果API密钥不匹配,则会发生未经授权的问题。 清除服务器密钥并重新生成新密钥。在服务器端编码中使用服务器API密钥。并正确使用android客户端中的发件人ID
答案 10 :(得分:0)
问题与授权有关,但是当我尝试以旧方式做事时,我遇到了这个错误, 我知道这是一个老问题,但让我把50美分放在上面。 首先,镇上有一个名为&#34; Firebase Cloud Messaging FCM&#34;的新孩子。请允许我引用谷歌:
FCM是Firebase品牌下的新版GCM。它继承了 GCM的核心基础架构,带有用于制作云消息传递的新SDK 发展更容易。
升级到FCM SDK的好处包括:
更简单的客户端开发。你不再需要自己编写 注册或订阅重试逻辑。一个开箱即用的 通知解决方案您可以使用Firebase通知,a 带有Web控制台的无服务器通知解决方案,可让任何人 根据Firebase向特定目标用户发送通知 分析见解。 More information about FCM Configuration For android studio
我希望这可以帮助那些试图以旧方式做事的人
答案 11 :(得分:0)
要使用Firestore
,您应该使用Web API key
firebase控制台为您提供,您可以在以下位置找到
https://console.firebase.google.com/project/<yourProjectName>/settings/general/<yourAppPckageName>
。
但是,要使用Firebase
向您的移动设备客户端推送通知,您应该使用Server key
开发者控制台为您提供,您可以在以下位置找到
https://console.developers.google.com/apis/credentials?project=<yourProjectName>
答案 12 :(得分:-1)
以上的事情都完成了然后检查curl init操作的功能
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
如果不包含,则包括或不包含功能
答案 13 :(得分:-1)
我有同样的问题。我正在做的是,代替API密钥,我发送消息而不是消息,我发送API密钥。只要检查你是否犯了同样的错误。