Firebase 401未经授权的错误FCM

时间:2016-06-04 17:38:01

标签: android firebase-cloud-messaging

我正在尝试测试Firebase Cloud消息传递API,因为控制台无法使用所有功能(特别是在应用程序处于后台时自定义通知)。但由于某些原因,我无法让它工作,它总是出现401错误。我调查了这个的原因,并在重新生成新的服务器密钥后尝试了它,但错误保持不变。令人惊讶的是,当我生成新的服务器密钥时,它不会反映在Firebase控制台中,并且它将服务器密钥显示为空。此外,我尝试将我的IP地址添加到服务器白名单IP但仍然没有运气。我附上了一个我对Postman做过的请求的截图(我用服务器密钥代替 serverKey

我坚持了几个小时,非常感谢你的帮助。enter image description here

10 个答案:

答案 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/

Project credentials

您可以使用服务器密钥或旧服务器密钥

答案 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)

通过 HTTPv1 使用 FCM 的 401(承载错误和解决方案)

如果您使用的是 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>

Google api console

Firebase console, click on the project-->settings

注意:Firebase控制台网络API密钥和Google控制台浏览器密钥与您使用其中任何一个都相同

enter image description here

enter image description here

2-如果您只按照第一步操作,您将收到未经授权的错误,要解决此问题,您需要通过添加发送推送的服务器IP地址来在Google控制台中授权您的浏览器密钥。在google api控制台中点击浏览器键右侧的编辑铅笔图标,在第一张图片上方

enter image description here

添加IP地址后,单击“保存” 确保您发送推送的设备令牌不为空,我希望您的推送现在可以成功发送。