---
title: "Get Real Client IP In FeathersJS"
date: 2020-02-25T13:58:45.000Z
author: Z.SHINCHVEN
tags: [FeathersJS, headers, http, socket-io, client ip]
canonical: https://atlassc.net/2020/02/26/feathersjs-client-real-ip
---
## IP Address In Request Headers Are Usually Set by Nginx

Your Nginx reverse proxy config should be something like this:

```nginx.conf
server {
    listen 80;
    server_name example.com;
    location / {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # add multiple forwarded ip address
        proxy_set_header X-Real-IP $remote_addr; # add single remote ip address, recommemded
        proxy_pass http://127.0.0.1:3000/;
        // other configs ...
    }
}
```

## In FeathersJS

By default, you are able to touch request headers in feathers context `context.params.headers`, it is managed by FeathersJS, and no matter what transport method you are using, `http` or `socket-io`, you will be able to get it.

## What does It Look like In Context

We can log the `context.params.headers` in a hook to find out:

```js
module.exports = {
  before: {
    all: [log(), (context) => {
      console.log("headers from hook", context.params.headers);
      return context;
    }],
  },
}
```

You will see data like below:

```js
const headers = 
{
  "x-forwarded-host": "x-forwarded-host", // given by nginx
  "x-forwarded-server": "x-forwarded-server", // given by nginx
  "x-forwarded-for": "REAL_IP", // given by nginx
  "x-real-ip": "REAL_IP", // given by nginx
  "host": "LOCALHOST:3030",
  "accept": "*/*",
  "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
  "origin": "http://example.com",
  "sec-fetch-site": "cross-site",
  "sec-fetch-mode": "cors",
  "sec-fetch-dest": "empty",
  "referer": "http://example.com",
  "accept-encoding": "gzip, deflate, br",
  "accept-language": "zh-CN,zh;q=0.9"
}
```

The `x-real-ip` will provide a single remote IP address set by Nginx.
