节点JS:仅允许服务器端调用我的api

时间:2018-09-11 10:54:56

标签: javascript node.js express cors microservices

我一直在绞尽脑汁寻求一个简单的解决方案。 可以说,我的Node JS应用程序中有10个API端点。

我已经允许其中3个公开,其余4个具有基于JWT的身份验证

现在我还有3条路由,这些路由将没有JWT,我只需要允许服务器端调用。没有浏览器,curl或邮递员都应该能够调用它们。如何从请求对象中识别出它源自服务器?

或者换句话说,如何拒绝对我的api的所有跨源调用?由于服务器端不属于CORS,因此应过滤掉

2 个答案:

答案 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"] }