javascript - 如何允许特定域访问云功能

标签 javascript firebase google-cloud-functions

我正在使用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")
  } 
})
});

最佳答案

通过 Firebase Cloud Functions 上的 HTTP 触发函数,cors 中间件 origin参数将是 未定义 , 请求 header 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向函数发出请求时自己 header 。例如:
await http.get(
  'https://example1.com/yourfunction',
  headers: {
    "Origin": "https://example2.com",
  },
);

问题是任何人都可以写上面的请求(Origin header可以伪造),如this post suggests验证访问权限的一种更简单的方法是发送类似 Firebase Auth 在您登录时生成的 token 之类的内容(或者您可以向发送方提供他们需要发送的 key ):
await http.get(
  'https://example1.com/yourfunction',
  headers: {
    "Authorization": "Bearer your_api_token_here",
  },
);

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

关于javascript - 如何允许特定域访问云功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44699856/

相关文章:

javascript - 如何使用蓝牙和 React Native 在两部手机之间传输数据?

javascript - 如果 async 属性用于加载 <head> 中的非阻塞 &lt;script&gt; ,它们是否保证在 body.readyState == 'loaded' 之前加载

javascript - 如何在前端使用 firebase 作为模块?

javascript - Firebase Init 第二次只创建 2 个文件

reactjs - 使用 firebase-functions 部署基于 React 的 SSR 应用程序时出错

javascript - 如何为外部 javascript 创建 TypeScript 定义文件,将方法添加到 String

javascript - 二叉树的字符串表示,找到离树根最远的地方

android - Firebase 动态链接未打开应用

firebase - 从firebase云函数获取UID

firebase - 无法部署 Firebase Cloud Functions [找不到模块 'protobufjs/minimal']