fcm api给出了“Access-Control-Allow-Credentials”错误

时间:2017-03-15 19:13:18

标签: angularjs firebase xmlhttprequest cors firebase-cloud-messaging

Firebase Cloud Messaging Server api正在发出预检错误

 $http({
  method: 'POST',
  url: 'https://fcm.googleapis.com/fcm/send',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'key=AIzaSyAZ-uI5....'
  },
  data: notificationData
}).then(function successCallback(response) {
   console.log('notification sent')
}, function errorCallback(response) {
  console.log('failed to send notification')
});


var notificationData = {
  "to": "dR3179CIBdk:APA91bGqvNV0a9x0khUn2rX3c403CsezB9UjPyVsmnGQXMsxruo7r8N2lravIhx6lTG_FLXwXRposoxxcSpb5Rnj84lN0o2B-a2_tzxWkdc40HlEb0kNVC25Y3V3-d2c6WUHOeNo3_UM",
  "data": {
    "productid": '57039b3ae4b07b473966ec8c',
    "title": "Off Upto 70% hello.com",
    "flashSaleId": "58c2ae6038d991a47c27asdw"
  },
  "notification": {
    "sound": "default",
    "title": "Off Upto 70% Olivetheory.com",
    "body": "Heavy Discounts on betsheets,Chairs,Beds,Pillows"
  }
}

丑陋的预检ERROR

  

XMLHttpRequest无法加载https://fcm.googleapis.com/fcm/send。对预检请求的响应未通过访问控制检查:当请求的凭据模式为“包含”时,响应中“访问控制 - 允许 - 凭证”标头的值为“必须为'真'”。因此,不允许原点“http://localhost:8080”访问。 XMLHttpRequest发起的请求的凭证模式由withCredentials属性控制。

注意:我不想禁用Chrome安全性。

不知道我在做什么错误

2 个答案:

答案 0 :(得分:0)

  

解决方案1 ​​在核心语言jquery,javascript或节点中创建简单的HTTP请求

var notificationData = {
  "to": "dR3179CIBdk...",
  "data": {
    "mrp": 5000,
    "retailPrice": 3000
  },
  "notification": {
    "color": "#FF0000",
    "title": "Off Upto 70% yofunky.com"
  }
}

$.ajax({
    url: 'https://fcm.googleapis.com/fcm/send',
    type: 'post',
    data: JSON.stringify(notificationData),
    headers: {
      'Content-Type': 'application/json',
      'Authorization': ios_Legacy_Server_Key
    },
    dataType: 'json',
    success: function (data) {
      console.info(data);
    }
  });

临时解决方案:发送 SIMPLE HTTP REQUEST SIMPLE 表示没有选项请求,也没有额外标题 。< / p>

缺点:使用angular然后在触发此http请求后,我必须在每个地方使用$ apply()

  

解决方案2

如上面的代码ui点击http https://fcm.googleapis.com/fcm/send的请求,在这里你可以从服务器点击这个http请求,不应该给出任何错误(可能遇到简单的请求)

答案 1 :(得分:0)

当我删除withCredentials属性时,此方法有效。 记下postModel,它是您发送的通知主体,格式为

{ "data": {
"score": "5x1",
"time": "15:10"
 },
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
 }

这是用于向fcm发送请求的JS代码。

var data = JSON.stringify(postModel);

  var xhr = new XMLHttpRequest();
  //xhr.withCredentials = true;

  xhr.addEventListener("readystatechange", function () {
    if (this.readyState === 4) {
      console.log(this.responseText);
    }
  });

  xhr.open("POST", "https://fcm.googleapis.com/fcm/send");
  xhr.setRequestHeader("Authorization", "key=YOUR SERVER API KEY");
  xhr.setRequestHeader("Content-Type", "application/json");
  xhr.send(data);