Узел JS: разрешать только серверные вызовы моему API - PullRequest
0 голосов
/ 11 сентября 2018

Я ломал голову над простым решением. Допустим, у меня есть 10 конечных точек API в моем приложении Node JS.

Я уже разрешил 3 из них быть публичными, остальные 4 имеют аутентификацию на основе JWT

Теперь у меня есть еще 3 маршрута, в которых не будет JWT, и мне нужно только разрешать вызовы на стороне сервера. Ни один браузер, ни локон, ни почтальон, не смогут их вызвать. Как определить из объекта запроса, что он исходит от сервера?

Или, другими словами, как отклонить все вызовы кросс-происхождения к моему API? Поскольку сторона сервера не попадает в CORS, они должны фильтровать через

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы должны использовать такую ​​же аутентификацию / авторизацию, как и для маршрутов, которые имеют аутентификацию JWT от клиентов.

Это означает, что служба вызывающей стороны также должна аутентифицироваться с использованием токена JWT, имеющего специальный role из service или что-то в этом роде (это на 100% ваше решение о том, какое соглашение вы выберете).Этот токен должен быть подписан вызывающей стороной и проверен принимающим микросервисом.

Преимущество этого решения в том, что оно не зависит от инфраструктуры, оно работает одинаково независимо от того, где развернуты службы.

0 голосов
/ 11 сентября 2018

Вы можете использовать пакет 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 и настроили его для отправки исходного IP через заголовок x-Real-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"] }
...