如何在App-Engine上运行的基于快速的Node JS应用程序中获取远程客户端的IP地址

尝试获取IP时,所有标准标题值都包含不正确的值。

req.ip: ::ffff:172.17.0.5 req.headers['x-forwarded-for']: 169.254.160.2 req.socket.remoteAddress: ::ffff:172.17.0.5 

所有这些导致错误的IP。

解决scheme:

  1. 使用let ip = req.headers['x-appengine-user-ip']或者
  2. 使用Express的信任代理设置,通过使用app.set('trust_proxy', 1);

说明: https : //cloud.google.com/appengine/docs/flexible/nodejs/runtime#https_and_forwarding_proxies

App Engine终止负载平衡器上的HTTPS连接,并将请求转发给您的应用程序。 用户的IP地址可以在标准的X-Forwarded-For标题和X-Appengine-User-Ip标题中find。 需要此信息的应用程序应将其Web框架configuration为信任该代理。

每个请求的标题值的完整列表:

 { "host": "<APP_ID>.appspot.com", "x-real-ip": "169.254.160.2", "x-forwarded-for": "169.254.160.2", "x-google-real-ip": "169.254.160.2", "x-appengine-user-ip": "2620:0:1002:100a:2c4b:4f6b:7851:a9d9", "x-appengine-api-ticket": "aad4544d4e04a1a0", "x-appengine-user-email": "", "x-appengine-auth-domain": "gmail.com", "x-appengine-user-id": "", "x-appengine-user-nickname": "", "x-appengine-user-organization": "", "x-appengine-user-is-admin": "0", "x-appengine-request-id-hash": "A104B85B", "x-appengine-request-log-id": "5748c500ff00ff09eec9a104b85b0001737e736d6172742d737061726b2d39333632320001323031363035323774313530323538000100", "x-appengine-https": "on", "x-appengine-datacenter": "us6", "x-appengine-default-version-hostname": "smart-spark-93622.appspot.com", "cache-control": "max-age=0", "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "upgrade-insecure-requests": "1", "save-data": "on", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36", "accept-language": "en-US,en;q=0.8", "x-appengine-country": "US", "x-appengine-region": "ca", "x-appengine-city": "san francisco", "x-appengine-citylatlong": "37.774929,-122.419416", "x-cloud-trace-context": "4a77265a7fa3e11be8cccebce59f7702/9314487514850703289;o=5" } 

可以看到, x-forwarded-for正在被设置为x-google-real-ip 。 所以用户的IP现在在x-appengine-user-ip可用。