【问题标题】:Getting Unauthorized Error 401 in Firebase Cloud Messaging in cURL command在 cURL 命令中的 Firebase 云消息传递中出现未经授权的错误 401
【发布时间】:2017-03-06 08:15:34
【问题描述】:

我要发送 Firebase 云消息传递,我面临的问题是我收到未经授权的错误 401。

我从 Firebase 网站获取了安全密钥,然后进行了设置。设备令牌已经在数据库中,我从数据库中读取没有问题。 到目前为止,这是我的代码:

<?php

function send_notification($tokens, $message)
{
    $url = 'https://fcm.googleapis.com/fcm/send';
    $fields = array('registration_ids' => $tokens, 'data' => $message);
    $headers = array('Authorization: key=' . "My Firebase key", 'Content-Type: application/json');
    echo "work well before init curl";
    $ch = curl_init();
    echo "init well";
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    echo "init finishe well";
    $result = curl_exec($ch);
    echo "Execute to get result";
    if ($result === false) {
        die('Curl failed: ' . curl_error($ch));
    }
    curl_close($ch);
    echo "function finished well";
    return $result;
}

$conn = mysqli_connect("localhost", "root", "mysql_password", "FCM") or die("Error connecting");

$sql = " Select Token From users";
$result = mysqli_query($conn, $sql);
$tokens = array();
if (mysqli_num_rows($result) > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        $tokens[] = $row["Token"];
    }
}
mysqli_close($conn);
$message = array("message" => " FCM PUSH NOTIFICATION TEST MESSAGE");
$message_status = send_notification($tokens, $message);
echo $message_status;
?>

【问题讨论】:

  • 嗨。您确定您正在使用 Firebase 控制台的“云消息传递”选项卡中显示的服务器密钥吗?
  • 我使用了 Firebase 面板中的 Web API 密钥

标签: php curl firebase firebase-cloud-messaging


【解决方案1】:

使用 FCM 时,您必须使用您的Firebase Console云消息传递 选项卡中看到的 服务器密钥 作为请求中 Authorization 的值。

【讨论】:

  • 是的,我使用 web id 而不是服务器密钥,现在我收到错误消息,提示缺少注册
  • MissingRegistration 是由于您的有效负载中没有 toregistration_ids 引起的。仔细检查并确保您指定了收件人。 :)
  • 是的,我的数据库中有用户令牌并很好地阅读它,您可以在上面的代码中看到 $tokens 已经存在
  • 这很奇怪。你能打印出发送的有效载荷吗?想看看结构。
  • 问题出在这行 $fields 它应该编码为 json
【解决方案2】:

使用https://developers.google.com/instance-id/reference/server 的文档,我想使用https://iid.googleapis.com/iid/info/IID_TOKEN 来获取有关应用实例的信息。

在我的应用程序代码中,我使用它来获取IDD_TOKEN

// Get token using example from https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/java/MainActivity.java.
// [START retrieve_current_token]
FirebaseInstanceId.getInstance().getInstanceId()
    .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
        @Override
        public void onComplete(@NonNull Task<InstanceIdResult> task) {
            if (!task.isSuccessful()) {
                Log.w(TAG, "getInstanceId failed", task.getException());
                return;
            }
            // Get new Instance ID token
            String token = task.getResult().getToken();
            System.out.println("task.getResult().getToken() = "+token);
            // Log and toast
            String msg = getString(R.string.msg_token_fmt, token);
            Log.d(TAG, msg);
            Toast.makeText(FirstActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });
// [END retrieve_current_token]

然后在 Android Studio 日志中,我找到了令牌(我正在更改令牌的值,因为我不想在这里发布真正的令牌):

I/System.out: task.getResult().getToken() = bepGr4F2b0Q:APB91cEAKsN1bGjMm5xsobxBHxuYZLfioTPMEIN90njdiK5C2MnOYF5NcOy6ot6XFanMTBIoKRGcyev5RJuydGWt1XHwsniNZ6h3Pjvn9Fqth-Mqgj_2-YN9pv_nMAugG8blc5boeDyH

这意味着IDD_TOKENbepGr4F2b0Q:APB91cEAKsN1bGjMm5xsobxBHxuYZLfioTPMEIN90njdiK5C2MnOYF5NcOy6ot6XFanMTBIoKRGcyev5RJuydGWt1XHwsniNZ6h3Pjvn9Fqth-Mqgj_2-YN9pv_nMAugG8blc5boeDyH。所以在我的 PHP 代码中我使用了这个:

$curlUrl = "https://iid.googleapis.com/iid/info/bepGr4F2b0Q:APB91cEAKsN1bGjMm5xsobxBHxuYZLfioTPMEIN90njdiK5C2MnOYF5NcOy6ot6XFanMTBIoKRGcyev5RJuydGWt1XHwsniNZ6h3Pjvn9Fqth-Mqgj_2-YN9pv_nMAugG8blc5boeDyH?details=true";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $curlUrl);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
//turning off the server and peer verification(TrustManager Concept).
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization:key=[My server key]'));
//getting response from server
$response = curl_exec($ch);
print_r($response);

[My server key] 在哪里找到?您可以在https://console.firebase.google.com/ 找到它。转到Cloud Messaging 选项卡,在Project credentials 部分中,您将找到Server key

结果是这样的:

{"applicationVersion":"50","connectDate":"2019-05-09","attestStatus":"NOT_ROOTED","application":"[我的包名]","scope":"* ","authorizedEntity":"[我的 Firebase 发件人 ID]","re​​l":{"topics":{"Toronto":{"addDate":"2019-05-09"}}},"appSigner":" [我的 appSigner]","platform":"ANDROID"}

没错。我可以说这些值与我连接的设备的IID_TOKEN 相对应,我可以识别出来并且一切都是正确的。我可以确认我的设备订阅了该主题并且一切正常!我可以使用https://iid.googleapis.com/iid/info/IID_TOKEN 来获取与我使用 Firebase 连接的 Android 设备相对应的应用实例的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2016-10-04
    • 2016-01-30
    • 2020-06-19
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    相关资源
    最近更新 更多