【问题标题】:How to allow specific domain to access cloud functions如何允许特定域访问云功能
【发布时间】:2017-11-25 18:14:33
【问题描述】:

我正在使用 firebase 云功能,第一次看到 cors 然后将 origin 设置为 true.. 但这样任何人都可以访问我的功能,所以我寻找了一种只允许特定域访问我的云功能的方法,我从cors github页面获取了代码并尝试了,但是在等待和等待之后却意外关闭了连接。

这是我的函数 index.js --

const functions = require('firebase-functions');
const cors = require('cors');

var whitelist = ['http://example1.com', 'http://example2.com']
var corsOptionsDelegate = function (req, callback) {
  var corsOptions;
  if (whitelist.indexOf(req.header('Origin')) !== -1) {
    corsOptions = { origin: true } // reflect (enable) the requested origin in the CORS response
  }else{
    corsOptions = { origin: false } // disable CORS for this request
  }
  callback(null, corsOptions) // callback expects two parameters: error and options
}

exports.api = functions.https.onRequest((req, res) => {
cors(req, res, () => {  
    var d = new Date();
   var n = d.getHours();
  if (n > 8 && n < 17) {
    res.status(200).send("Get started")
  } else {
    res.status(200).send("Closed")
  } 
})
});

【问题讨论】:

  • 您正在定义一个名为 corsOptionsDelegate 的函数,但您没有对它做任何事情。在我看来,函数必须在某个地方传递。
  • 好的,但我是新手,我不知道该怎么做,或者是否有办法只允许经过身份验证的用户访问
  • 您可以使用 Authentication headers 只允许经过身份验证的用户访问该功能,请参阅此处的答案:stackoverflow.com/a/43239529/8209335
  • 除了通常的“可能重复”评论之外,您是否得到过答案......

标签: javascript firebase google-cloud-functions


【解决方案1】:

使用 Firebase Cloud Functions 上的 HTTP 触发函数,cors 中间件 origin 参数将是 undefined,请求标头 Origin 值也是如此:

var whitelist = ['https://example1.com']
var corsOptions = {
  origin: function (origin, callback) {
    console.log(origin) // undefined
    if (whitelist.indexOf(origin) !== -1) {
      callback(null, true)
    } else {
      callback(new Error('Not allowed by CORS'))
    }
  }
}

app.get('/products/:id', cors(corsOptions), function (req, res, next) {
  console.log(req.header('Origin')) // undefined
  res.json({msg: 'This is CORS-enabled for a whitelisted domain.'})
})

除非您在向函数发出请求时自己设置了Origin 标头。例如:

await http.get(
  'https://example1.com/yourfunction',
  headers: {
    "Origin": "https://example2.com",
  },
);

问题是任何人都可以编写上述请求(Origin 标头可以伪造),因此this post suggests 验证访问的更简单的方法是发送类似令牌的东西Firebase Auth 在您登录时生成(或者您可以向发送方提供他们需要发送的密钥):

await http.get(
  'https://example1.com/yourfunction',
  headers: {
    "Authorization": "Bearer your_api_token_here",
  },
);

然后,您将在 Cloud Function 中 verify that it's legit(而不是检查潜在的虚假来源)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2021-10-09
    • 2020-11-30
    相关资源
    最近更新 更多