我正在尝试测试Firebase Cloud消息传递API,因为控制台无法使用所有功能(特别是在应用程序处于后台时自定义通知)。但由于某些原因,我无法让它工作,它总是出现401错误。我调查了这个的原因,并在重新生成新的服务器密钥后尝试了它,但错误保持不变。令人惊讶的是,当我生成新的服务器密钥时,它不会反映在Firebase控制台中,并且它将服务器密钥显示为空。此外,我尝试将我的IP地址添加到服务器白名单IP但仍然没有运气。我附上了一个我对Postman做过的请求的截图(我用服务器密钥代替 serverKey 。
答案 0 :(得分:203)
我不知道是否有人使用[Web API密钥]作为[YOUR_SERVER_KEY]进行POSTMAN测试并继续获得“错误”#39; [Web API密钥]不是[YOUR_SERVER_KEY]。
您应该转到Firebase控制台并检查:
获取正确的服务器密钥。
希望有所帮助。
答案 1 :(得分:32)
我从你的截图中注意到你使用的是“key:serverKey”。您可以尝试使用“key = serverKey”吗?
此外,您不需要“POST fcm.googleapus.com/fcm/send”;这不是适当的json,并会解释你所看到的错误。请求的URL已在别处定义,因此将其从有效负载中删除。
答案 2 :(得分:15)
我遇到了同样的问题。
问题是我使用的是旧版服务器密钥。当我使用新版本的服务器密钥时,问题就解决了。
你的firebase控制台转到设置中的- >云消息传递
然后使用新的服务器密钥。它比旧版本密钥长。
答案 3 :(得分:8)
转到https://console.firebase.google.com/u/0/project/[project-name]/settings/cloudmessaging/
您可以使用服务器密钥或旧服务器密钥
答案 4 :(得分:2)
我也面临着同样的问题......我在php中使用curl发布,只有当我在我的LocalHost服务器上存储了php文件时才有效。当我尝试通过在线免费托管访问文件时,它会说Unautorized 401.
所以我建议你可以使用Localhost。
答案 5 :(得分:0)
我在服务器端代码(C#)遇到同样的问题。
您基本上使用错误的服务器密钥(或API密钥)作为服务端代码。
按照以下链接覆盖我发布的stackoverflow(有助于查找服务器密钥(或API密钥))
FCM (Firebase Cloud Messaging) Push Notification with Asp.Net
答案 6 :(得分:0)
如果您使用的是 FCM via HTTP v1,那么您将不得不发出两个连续的 POST 请求:
1/ 在第一次调用中,您使用您的 firebase 服务帐户密钥向“https://accounts.google.com/o/oauth2/token”(或使用 API 包)发出 POST 请求
'https://console.firebase.google.com/u/0/project/{{firebaseProjectName}}/settings/serviceaccounts/adminsdk'
获取访问令牌。
2/ 然后您必须向“https://fcm.googleapis.com/v1/projects/{{firebaseProjectName}}/messages:send”发出另一个 POST 请求。如果您已按照 firebase 网站上从旧版 HTTP 迁移到 HTTP v1(非常清晰的文档)的步骤进行操作,则必须对发布请求的内容进行一些小的更改,并使用“Bearer ${accessToken.data}”用于授权。
在我的例子中,我没有正确等待第一个函数中的 accessToken(忘记了发出 post 请求的函数前面的 'await' 关键字,AndroidStudio 也没有注意到有什么问题)。
确保您等待第一个 post 请求的结果,因为它是一个 Future。
如果不这样做,当您发出第二个 POST 请求时,Bearer 将为 null,因为您没有等待它。
答案 7 :(得分:0)
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import javax.validation.Valid;
import javax.validation.constraints.Size;
public class PushNotificationSubmit {
public static void main(String[] args) {
new PushNotificationSubmit().send("sample message title", "sample message body");
}
final String serverKey = "AAAA_*******";
final String fcmUrl = "https://fcm.googleapis.com/fcm/send";
/**
* note from google: The value should be an array of registration tokens to which to send the multicast message. The array must contain at least 1 and at most 1000 registration tokens.
* send to specific users
*
* @param messageTitle
* @param messageBody
* @param tokenList
*/
@Size.List({@Size(min = 1), @Size(max = 999)})
public void send(String messageTitle, String messageBody, List<String> tokenList) {
try {
String payloadJson = createMessageAsJson(messageTitle, messageBody, tokenList);
doSend(payloadJson);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* send to all users that registered in my topic
*
* @param messageTitle
* @param messageBody
*/
public void send(String messageTitle, String messageBody) {
try {
String payloadJson = createMessageAsJson(messageTitle, messageBody, null);
doSend(payloadJson);
} catch (Exception e) {
e.printStackTrace();
}
}
private String createMessageAsJson(String messageTitle, String messageBody, List<String> tokenList) {
JSONObject payloadObj = new JSONObject();
try {
JSONObject notifyObj = new JSONObject();
notifyObj.put("title", messageTitle);
notifyObj.put("body", messageBody);
payloadObj.put("notification", notifyObj);
if (tokenList != null) {
if (tokenList != null && tokenList.size() > 0) {
JSONArray regId = new JSONArray();
for (int i = 0; i < tokenList.size(); i++) {
regId.put(tokenList.get(i));
}
payloadObj.put("registration_ids", regId);
}
} else {
payloadObj.put("to", "/topics/all");
}
return payloadObj.toString();
} catch (Exception e) {
// TODO: add logger
e.printStackTrace();
throw e;
}
}
private void doSend(String payloadJson) throws Exception {
HttpClient httpclient = HttpClientBuilder.create().build();
try {
HttpPost httpPost = new HttpPost(fcmUrl);
httpPost.setHeader("Content-Type", "application/json");
httpPost.setHeader("Authorization", "key=" + serverKey);
httpPost.setEntity(new StringEntity(payloadJson, "UTF-8"));
HttpResponse response = httpclient.execute(httpPost);
HttpEntity entity = response.getEntity();
System.out.println("push notification status: " + response.getStatusLine());
EntityUtils.consume(entity);
} finally {
httpclient.getConnectionManager().shutdown();
}
}
}
答案 8 :(得分:0)
在 C# HttpClient 响应中
对于错误的服务器密钥会发生,无效密钥,未授权,401
答案 9 :(得分:-1)
我遇到了同样的问题,我使用以下步骤解决了这个问题
1-在您发送推送的服务器中,仅使用浏览器密钥,您可以从Firebase控制台或google api控制台获取,如下图所示: < / p>
Firebase console, click on the project-->settings
注意:Firebase控制台网络API密钥和Google控制台浏览器密钥与您使用其中任何一个都相同
2-如果您只按照第一步操作,您将收到未经授权的错误,要解决此问题,您需要通过添加发送推送的服务器IP地址来在Google控制台中授权您的浏览器密钥。在google api控制台中点击浏览器键右侧的编辑铅笔图标,在第一张图片上方
添加IP地址后,单击“保存” 确保您发送推送的设备令牌不为空,我希望您的推送现在可以成功发送。