问题信息
我正在使用 cors 来确保只有特定 IP 才能在我的 REST API 上GET
和POST
数据。
每次有人想要GET
或POST
数据时,返回的IP 是托管应用程序的服务器的IP,而不是该人自己的IP地址。
此时所有人都可以访问REST API,因为我的前端运行在同一台服务器上,前端需要有GET
和POST
的权限> 数据,所以我将服务器的 IP 地址列入白名单。
因为每个尝试连接的人,其 IP 地址自动成为服务器的地址,每个人都可以访问 REST API。
技术资料
我的 REST API 使用 pm2 在端口 8080 上运行,我使用 Nginx 将其重新路由到使用 SSL 的端口 8877。 8877 是我的 rest 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;
}
}
Rest API cors
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 地址而不是服务器的 ip 地址。
最佳答案
尝试将这些配置放入您的 nginx 中:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;
没有这个,你的后端将只接收 nginx IP 地址。
关于node.js - NodeJS - 返回客户端 ip 地址而不是服务器的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52232998/