Информация о проблеме
Я использую cors, чтобы убедиться, что только определенные IP-адреса могут GET
и POST
данные в моем REST API.
Возвращаемый IP-адрес, каждый раз, когда кто-то хочет GET
или POST
данные, - это IP-адрес сервера, на котором размещено приложение, а не его собственный IP-адрес.
В настоящий момент каждый может получить доступ к REST API, поскольку мой интерфейс работает на том же сервере, интерфейс должен иметь разрешение на данные GET
и POST
, поэтому я внес белый список в IP-адрес сервера.
Поскольку каждый, кто пытается подключиться, его IP-адрес автоматически становится адресом сервера, каждый имеет доступ к REST API.
Техническая информация
Мой REST API работает с использованием pm2 на порту 8080, я перенаправил его с помощью Nginx на порт 8877, использующий SSL. 8877 - это конечная точка моего остальных API, возможно, именно поэтому IP-адрес клиента автоматически становится IP-адресом сервера?
# General HTTP to HTTPS
server {
listen 80;
listen [::]:80;
server_name www.example.com default_server;
location / {
return 302 https://$host$request_uri;
}
}
#Web Application
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name www.example.com default_server;
root /var/www/example.com;
index index.html;
ssl_stapling on;
ssl_stapling_verify on;
ssl_certificate /etc/nginx/ssl/example.com/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location / {
#...
try_files $uri $uri/ /index.html$is_args$args;
#...
}
}
#Rest API http to https
server {
listen 8877 ssl;
listen [::]:8877 ssl;
server_name example.com;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
ssl_stapling on;
ssl_stapling_verify on;
ssl_certificate /etc/nginx/ssl/example.com/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location / {
proxy_pass http://example.com:8080;
}
}
Cors API отдыха
const whitelist = [
'::ffff:111.11.11.111', etc.];
var corsOptions = {
origin: (origin, callback) => {
let trafficAllowed = {};
console.log("IP: ", origin);
if (whitelist.indexOf(origin) !== -1) {
trafficAllowed = {origin: false}
} else {
trafficAllowed = {origin: true}
}
callback(null, trafficAllowed)
}
};
app.use((req, res, next) => {
req.headers.origin =
req.connection.remoteAddress ||
req.headers['x-forwarded-for'] ||
req.socket.remoteAddress ||
(req.connection.socket ? req.connection.socket.remoteAddress : null);
next();
});
app.use(cors(corsOptions));
Возможные пути ее решения
- Можно ли назначить SSL напрямую порту 8080 (REST API использует pm2)?
- Как получить IP-адрес клиента вместо его сервера.