web-dev-qa-db-fra.com

Le serveur Google GCM renvoie l'erreur non autorisée 401

J'utilise les services GCM pour transmettre des informations à partir du serveur. Si j'utilise la clé de navigateur, le message de succès s'affiche comme suit: {"multicast_id": 4849013215736515938, "success": 1, "failure": 0, "canonical_ids": 0, "results": [{"message_id": " 0: 1348742583011905% 2adac3a0f9fd7ecd "}]} Mais je n’ai reçu aucune notification sur le périphérique. Et si j'utilise la clé du serveur, cela indique Erreur non autorisée 401 . Mon code est indiqué ci-dessous:

$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;

S'il vous plaît aidez-moi pour ce problème. Merci d'avance.

30
Sushil Kandola

Avez-vous mis la liste IP de votre serveur sur liste blanche? Ce n'est pas nécessaire par défaut pour la clé de navigateur, mais pour la clé de serveur.

Tu peux le vérifier ici:

https://code.google.com/apis/console/#project:[votre numéro de projet]: accès

31
Jos

Une autre réponse proposait déjà de mettre l’adresse IP en liste blanche, ce qui semble plutôt évident. Ce qui a résolu le problème pour moi a été la liste blanche de mon adresse IPv6 . C'était la clé! J'espère que ça aidera quelqu'un d'autre.

19
DanO

J'ai tout essayé dans ce fil, et toujours pas de chance. 

J'ai donc vérifié les API activées ( API et Auth -> API, Enabled APIs ) et me suis rendu compte que j'avais activé Google Cloud Messaging for Chrome pas Google Cloud Messaging for Android. Dès que j'ai activé ce dernier, cela a fonctionné immédiatement.

Vérifiez que vous avez la bonne API activée!

14
Dan Bartlett

Comme beaucoup de gens l'ont écrit, vous devez ajouter à la liste blanche vos serveurs IPV4 et IPV6. Si vous voulez seulement IPV4, ajoutez ceci à votre curl php init:

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
3
Thomas Decaux

Je mettais au 

$apiKey = "xxxxx"

comme le numéro de projet (identifiant de projet) que je mets sur l'application Android Client, mais je me suis trompé sur le serveur. Il doit être appkey depuis la console Google Cloud (où vous activez Google Cloud Messaging pour Android).

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

dans mon cas, j'avais le projet par défaut 'Service Compte-projet' sur la plate-forme: 'Web' mais il y avait juste Hosted Application section et aucune preuve d'une clé api . mais quand je crée un nouveau Web Apps appelé 'Mon application' qui contenait 4 sections OAuth 2.0 Client ID, Certificate, Clé du serveur, Browser Key j'ai finalement trouvé la clé de l'API ;-)

peut juste moi qui ne le sais pas mais je crois que cette réponse pourrait aussi aider à quelqu'un

2
m1uan

pour moi le problème était que vous deviez activer l’API. Avoir une API configurée ne suffit pas. Vérifiez que Google Cloud Messaging pour Android apparaît sur les API activées dans API> et> API activées.

Si ce n'est pas cliquez sur l'onglet bibliothèque de l'API dans APIS et l'activer . \

1
Nir

Si je ne me trompe pas, votre APIKEY doit être encodé en base64. 

Essayez également var_dump ($ results) pour voir si vous obtenez des informations.

0
Case

Vous devez avoir un projet différent de celui par défaut. Créez un projet puis créez une clé. N'utilisez pas le projet par défaut. 

0
Pavan Pyati

En regardant le code, je reconnais que cela provient d’un échantillon php-gcm posté quelque part en ligne. C'est assez agréable et je peux vous assurer que les clés de navigateur et les adresses sur liste blanche (pas IPV6 ou bas64 apikey) fonctionnent.

La raison pour laquelle aucun message n’est affiché, c’est que la fonction de notification d’envoi que vous utilisez 'data' => array("message"=>$message)

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

Cela permettra à l'intention de lire le message contenu sous cette clé. Le message lui-même est obtenu à partir de la méthode GCMIntentService collée ci-dessous:

 @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);
}
0
Lettings Mall

Le problème est le suivant: j’utilisais 2 serveurs, un serveur intermédiaire et l’autre le serveur de production. Pour mon serveur de transfert, qui était hébergé à l'aide de Digital Ocean, j'ai entré l'adresse inet dans la clé pour les applications serveur les adresses IP autorisées, et tout s'est bien déroulé. 

Cependant, cela a échoué lorsque j'ai changé mon adresse inet à partir de mon serveur de production. Au lieu de cela, je devais utiliser Inet6 addr:/64 Scope: Global pour que cela fonctionne. Pour obtenir la valeur si vous rencontrez le même problème, entrez simplement ifconfig et recherchez l'entrée ci-dessus. Entrez cette valeur dans les adresses IP autorisées et tout fonctionnera correctement. 

0
Qin Zhengquan

Si j'avais ce problème, j'utilisais GCM (messagerie en nuage Google). Mais après septembre 2016, la clé de serveur sur le GCM ne fonctionnera plus, vous devez utiliser FCM (Firebase Cloud Messaging). Créez de nouvelles clés de serveur uniquement dans la console Firebase à l'aide de l'onglet Messagerie en nuage du panneau Paramètres. Je suis allé à la console de base de feu console.firebase.google.com (je ne l'avais pas encore utilisé) et il m'a demandé d'importer mon projet. Soudainement, cette nouvelle clé de serveur est revenue sur la console GCM. Si vous utilisez GCM, utilisez la "clé héritée" indiquée ci-dessous.

0
Nate Hammond