簡體   English   中英

Google GCM 服務器返回未經授權的錯誤 401

[英]Google GCM server returns Unauthorized Error 401

我正在使用 GCM 服務從服務器推送信息。 如果我使用瀏覽器鍵,它會將成功消息顯示為: {"multicast_id":4849013215736515938,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0: 1348742583011905%2adac3a0f9fd7ecd"}]}但我沒有在設備上收到任何通知。 如果我使用服務器密鑰,它會顯示Unauthorized Error 401 我的代碼如下所示:

$apiKey = "xxxxx";
$registrationIDs = array("xxxxxxxx");
$message = "testing Process";
$url = 'https://android.googleapis.com/gcm/send';
$fields = array(
        'registration_ids'  => $registrationIDs,
        'data'              => array("message"=>$message),
        );
$headers = array( 
        'Authorization: key=' . $apiKey,
        'Content-Type: application/json'
        );
$ch = curl_init();
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, 0); 
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($fields) );

$result = curl_exec($ch);
if(curl_errno($ch)){ echo 'Curl error: ' . curl_error($ch); }
curl_close($ch);
echo $result;

請幫我解決這個問題。 提前致謝。

您是否將服務器的 IP 列入白名單? 默認情況下,這對於瀏覽器密鑰不是必需的,但對於服務器密鑰是必需的。

你可以在這里查看:

https://code.google.com/apis/console/#project:[您的項目編號]:訪問

另一個答案已經建議將 IP 地址列入白名單,這似乎很明顯。 為我修復的是將我的IPv6 地址列入白名單。 那是關鍵! 我希望這對其他人有幫助。

我嘗試了這個線程中的所有內容,但仍然沒有運氣。

因此,我檢查了已啟用的 API( APIs 和 Auth -> APIs, Enabled APIs ),並意識到我啟用Google Cloud Messaging for Chrome Google Cloud Messaging for Android不是Google Cloud Messaging for Android 一旦我啟用后者,它立即起作用。

仔細檢查您是否啟用了正確的 API!

正如許多人所寫,您必須將服務器 IPV4 和 IPV6 列入白名單。 如果您只需要 IPV4,請將其添加到您的 curl php init 中:

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

使用瀏覽器密鑰使用選項創建新的瀏覽器密鑰並在您的代碼中使用此密鑰。 https://code.google.com/apis/console/?pli=1#project:42053154xxxx:access

我曾經把

$apiKey = "xxxxx"

就像我放到 Android 客戶端應用程序中的項目編號(項目 ID)一樣,但我在服務器中錯誤必須是來自谷歌雲控制台的 appkey,(您在其中激活了適用於 Android 的谷歌雲消息傳遞

    ProjectXXX -> APIs & auth -> Registered Apps -> Web App -> Server Key
 -> Api key

就我而言,我在平台上有默認項目“服務帳戶項目”:“Web”,但只有Hosted Application section ,沒有任何 api 密鑰的證據。 但是當我創建名為“我的應用程序”的新Web Apps程序時,它包含 4 個部分OAuth 2.0 Client IDCertificate服務器密鑰Browser Key我最終找到了 api 密鑰;-)

可能只有我不知道,但我相信這個答案也可以幫助某人

對我來說,問題是你必須啟用 api。 僅設置 API 是不夠的。 檢查 Google Cloud Messaging for Android 是否出現在 APIs-> enabled APIs 中的已啟用 API 上。

如果不是,請單擊 APIS 中的 API 庫選項卡並啟用它。 \\

如果我沒記錯的話,您的 APIKEY 需要進行 base64 編碼。

還可以嘗試 var_dump($results) 以查看您是否獲得了信息。

查看代碼,我認識到這是來自在線某處發布的 php-gcm 示例。 它非常好,我可以向您保證,瀏覽器密鑰和列入白名單的 ip(不是 IPV6 或 bas64 apikey)都可以工作。

未顯示消息的原因是您使用的發送通知函數'data' => array("message"=>$message)以“message”鍵為目標,這是您必須傳遞給待處理意圖的內容IE

notification.setLatestEventInfo(context, title, message, intent);

這將使 Intent 能夠讀取包含在該鍵下的消息。消息本身是從粘貼在下面的 GCMIntentService 方法中獲取的:

 @Override
protected void onMessage(Context context, Intent intent) {
    Log.i(TAG, "Received message");
    String message = intent.getExtras().getString("message");
    Log.d(TAG, "The intent contains: " + intent.getExtras());
    displayMessage(context, message);
    // notifies user
    generateNotification(context, message);
}

問題是:我使用了 2 台服務器,1 台登台,另一台是生產服務器。 對於使用數字海洋托管的臨時服務器,我在服務器應用程序允許的 IP 地址的密鑰中輸入了 inet 地址,並且它工作得很好。

但是,當我從生產服務器更改為我的 inet 地址時,它失敗了。 相反,我必須使用 inet6 addr: /64 Scope:Global 才能工作。 要在遇到相同問題時獲取該值,只需輸入ifconfig ,然后找到上述條目。 在允許的 IP 地址中輸入該值,它會正常工作。

您必須擁有與默認項目不同的項目。 創建一個項目,然后創建一個密鑰。 不要使用默認項目。

遇到了這個麻煩,我正在使用 GCM(谷歌雲消息傳遞)。 但是在 2016 年 9 月之后,GCM 上的服務器密鑰將無法使用,您必須使用 FCM(firebase 雲消息傳遞)。 僅使用“設置”面板的“雲消息傳遞”選項卡在 Firebase 控制台中創建新的服務器密鑰。 我轉到 firebase 控制台 console.firebase.google.com(我還沒有使用它),它要求我導入我的項目。 GCM 控制台上突然出現了這個新的服務器密鑰。 如果使用 GCM,請使用您在此處看到的“舊密鑰”。

我們正在尋找解決方案。 更具體地說,添加這個 curl 選項: curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM