【问题标题】:How to ensure HTTP trigger will be called only via HTTPS?如何确保仅通过 HTTPS 调用 HTTP 触发器?
【发布时间】:2019-07-05 19:20:23
【问题描述】:

我正在使用 NodeJS 和 Express (Firebase) 在 Cloud Functions 上构建 API,并且我想只接受通过 HTTPs 的调用,因此通过普通 HTTP 进行的调用将失败。 有可能吗?

【问题讨论】:

  • 不确定是否有使用 express 的简单方法,但您可以从 X-Forwarded-Proto 标头获取协议

标签: node.js firebase https google-cloud-functions


【解决方案1】:

您应该检查传递给您的函数的请求对象。它将是一个 Express 类型的 Request 对象。请求有一个名为protocol 的属性,它应该是“https”。所以:

functions.https.onRequest((req, res) => {
    if (req.protocol !== "https") {
        // reject the request
        res.sendStatus(403)
    }
})

【讨论】:

    【解决方案2】:

    一般来说,您希望为每个协议运行一个应用程序来侦听不同的端口。要解决您的问题,您可以简单地忽略对 http 实例的请求或将每个 http 请求重定向到 https 请求。

    这是一个中间件:

    app.use(function(request, response){
      if(!request.secure){
        response.redirect("https://" + request.headers.host + request.url);
      }
    });
    

    见快递documentation

    【讨论】:

    • 这不适用于 Cloud Functions 可调用函数。没有暴露的 express 中间件(即使 OP 用 Express 标记了它,它只是不涉及)。
    • 我尝试使用这个 req.secure 变量进行 Postman 调用,但它总是说它是安全的。
    • @AlissonEnz req.secure 相当于手动检查http协议express documentation,可以看代码来三角问题。
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多