【发布时间】:2021-02-08 01:06:20
【问题描述】:
有没有办法让nestjs REST API 只接受来自https 域的调用?
Like 默认阻止任何 curl 或 postman 请求,并且只接受我的前端客户端 (https://my-example-domain.com) 发出的请求。
【问题讨论】:
标签: api rest security https nestjs
有没有办法让nestjs REST API 只接受来自https 域的调用?
Like 默认阻止任何 curl 或 postman 请求,并且只接受我的前端客户端 (https://my-example-domain.com) 发出的请求。
【问题讨论】:
标签: api rest security https nestjs
解决您的问题的方法是使用为所有路由定义 express 的中间件。
首先我们要解决wget、curl和postman的问题。这些工具类似于浏览器,因此检测它们的唯一方法是通过它们的名称 (User-Agent),因此我们使用 req.get (" User-Agent ") 获取用户代理的名称并使用 indexOf 进行检查,如果这些名称存在并且我们转换它们转换为Boolean ()method 之类的布尔值,然后我们检查名称是否与三个中的一个匹配,如果点击则返回。
现在我们将使用https 协议,很简单,我们只将用户重定向到以https开头的url,但保持在当前路由上。
const express = require("express");
const app = express();
app.use((req, res, next) => {
let userAgent = req.get("User-Agent").toLowerCase();
let isWget = Boolean(userAgent.indexOf("wget"));
let isCURL = Boolean(userAgent.indexOf("curl"));
let isPostman = Boolean(userAgent.indexOf("postman"));
if (isWget || isCURL || isPostman) {
res.sendStatus(404);
return next();
}
res.redirect(`https://${req.headers.host + req.url}`);
return next();
})
app.listen(port, () => {
console.log("Listening!");
})
【讨论】: