我一直在绞尽脑汁寻求一个简单的解决方案。 可以说,我的Node JS应用程序中有10个API端点。
我已经允许其中3个公开,其余4个具有基于JWT的身份验证
现在我还有3条路由,这些路由将没有JWT,我只需要允许服务器端调用。没有浏览器,curl或邮递员都应该能够调用它们。如何从请求对象中识别出它源自服务器?
或者换句话说,如何拒绝对我的api的所有跨源调用?由于服务器端不属于CORS,因此应过滤掉
答案 0 :(得分:4)
对于来自客户端的具有JWT身份验证的路由,应该使用类似的身份验证/授权。
这意味着调用方服务还应该使用JWT令牌进行身份验证,并使用role
之类的特殊service
或类似的符号(这是您决定选择哪种约定的100%)。该令牌应由调用方签名并由接收微服务验证。
此解决方案的优点是,它不依赖于基础结构,无论在何处部署服务,其工作方式都相同。
答案 1 :(得分:3)
您可以使用express-ipfilter软件包,并将其仅应用于您要保护的某些路由:
const express = require('express'),
ipfilter = require('express-ipfilter').IpFilter;
// Whitelist the following IPs
const ips = ['127.0.0.1'];
// Create the route
app.get("/securePath", ipfilter(ips, {mode: 'allow'}), (req, res) => {
// only requests from 127.0.0.1 (localhost/loopback) can get here
});
app.get("/openPath", (req, res) => {
// all requests can get here
});
app.listen(3000);
如果在代理后面使用Node,则可能需要配置代理以使用实际IP设置标头,然后将ipfilter
函数的detectIp
属性中的函数传递给第二个参数。
假设您正在使用nginx并将其配置为通过x-Real-IP
头发送原始IP,则可以将此函数传递给ipfilter
:
const express = require('express'),
ipfilter = require('express-ipfilter').IpFilter,
ips = ['127.0.0.1'];
app.get("/securePath", ipfilter(ips, {mode: 'allow', detectIp: getIp}), (req, res) => {
// only requests from 127.0.0.1 (localhost/loopback) that go through the proxy can get here.
});
app.get("/openPath", (req, res) => {
// all requests can get here
});
app.listen(3000);
function getIp(req) { return req.headers["X-Real-IP"] }