【发布时间】:2018-09-08 07:22:38
【问题描述】:
问题信息
我正在使用 cors 来确保只有特定 IP 才能在我的 REST API 上使用 GET 和 POST 数据。
每次有人想要GET 或POST 数据时返回的IP 是托管应用程序的服务器的IP,而不是该人自己的IP 地址。
此时每个人都可以访问REST API,因为我的前端运行在同一台服务器上,前端需要拥有GET和POST数据的权限,所以我将服务器的IP地址列入白名单。
由于每个人都在尝试连接,它的 ip 地址自动成为服务器的地址,每个人都可以访问 REST API。
技术信息
我的 REST API 在端口 8080 上使用 pm2 运行,我使用 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地址。
【问题讨论】: