479 votes

Comment puis-je obtenir l'adresse IP de l'utilisateur en utilisant Node.js ?

J'ai un site dans node et j'ai une post sur app.post "/", mycontroller.example et dans ce contrôleur, j'aimerais obtenir l'adresse IP de l'utilisateur qui a envoyé la requête. J'essaie de construire une API.

Toute aide serait grandement appréciée.

Merci

41 votes

Si vous utilisez Express, vous pouvez utiliser req.ip source - expressjs.com/fr/api.html#req.ip

0 votes

51 votes

Pour ceux qui travaillent à partir de localhost - comme je l'ai fait, le résultat pour toutes les réponses ci-dessous (presque toutes les réponses fonctionnent) pourrait venir ::1 . Cela m'a rendu confus pendant un certain temps. J'ai découvert plus tard que ::1 est l'adresse IP réelle et est IPV6 pour localhost. Hope this helps someone

18voto

Ben Davies Points 501

request.headers['x-forwarded-for'] || request.connection.remoteAddress

Si le x-forwarded-for est présent, alors utilisez-le, sinon utilisez l'en-tête .remoteAddress propriété.

El x-forwarded-for est ajouté aux requêtes qui passent par des équilibreurs de charge (ou d'autres types de mandataires) mis en place pour l'application HTTP o HTTPS (il est également possible d'ajouter cet en-tête aux requêtes lors de l'équilibrage au niveau d'un serveur de données). TCP niveau en utilisant protocole de proxy ). Cela s'explique par le fait que le request.connection.remoteAddress la propriété contiendra l'adresse IP privée de l'équilibreur de charge plutôt que l'adresse IP publique du client. En utilisant un OU dans l'ordre ci-dessus, vous vérifiez l'existence d'une instruction x-forwarded-for et l'utiliser s'il existe sinon utiliser l'en-tête request.connection.remoteAddress .

17voto

ashishyadaveee11 Points 809

La fonction suivante a tous les cas couverts aidera

var ip;
if (req.headers['x-forwarded-for']) {
    ip = req.headers['x-forwarded-for'].split(",")[0];
} else if (req.connection && req.connection.remoteAddress) {
    ip = req.connection.remoteAddress;
} else {
    ip = req.ip;
}console.log("client IP is *********************" + ip);

11voto

Attention :

Ne l'utilisez pas aveuglément pour une limitation importante du débit :

let ip = request.headers['x-forwarded-for'].split(',')[0];

C'est très facile à usurper :

curl --header "X-Forwarded-For: 1.2.3.4" "https://example.com"

Dans ce cas, l'adresse IP réelle de l'utilisateur sera :

let ip = request.headers['x-forwarded-for'].split(',')[1];

Je suis surpris qu'aucune autre réponse ne l'ait mentionné.

10voto

Mansi Teharia Points 341

Il y a deux façons d'obtenir l'adresse IP :

  1. let ip = req.ip

  2. let ip = req.connection.remoteAddress;

Mais il y a un problème avec les approches ci-dessus.

Si vous exécutez votre application derrière Nginx ou n'importe quel proxy, chaque adresse IP unique sera 127.0.0.1 .

Donc, la meilleure solution pour obtenir l'adresse IP de l'utilisateur est :-.

let ip = req.header('x-forwarded-for') || req.connection.remoteAddress;

9voto

anik islam Shojib Points 392

Je les ai tous essayés, mais ça n'a pas marché,

console.log(clientIp);
console.log(req.ip);

console.log(req.headers['x-forwarded-for']);
console.log(req.connection.remoteAddress);
console.log(req.socket.remoteAddress);
console.log(req.connection.socket.remoteAddress.split(",")[0]);

Lorsque vous exécutez une application Express derrière un proxy, par exemple Nginx, vous devez définir la variable d'application trust proxy sur true. Express propose d'autres valeurs de trust proxy que vous pouvez consulter dans leur documentation, mais les étapes ci-dessous ont fonctionné pour moi.

  1. app.set('trust proxy', true) dans votre application Express.

app.set('trust proxy', true);

  1. Ajouter proxy_set_header X-Forwarded-For $remote_addr dans le Nginx pour votre bloc serveur.
  location /  {
                proxy_pass    http://localhost:3001;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $remote_addr;  # this line
                proxy_cache_bypass $http_upgrade; 
        }
  1. Vous pouvez maintenant lire l'adresse IP du client dans le fichier req.header('x-forwarded-for') ou req.connection.remoteAddress ; Code complet pour ipfilter
module.exports =  function(req, res, next) {
    let enable = true; // true/false
    let blacklist = ['x.x.x.x'];
    let whitelist = ['x.x.x.x'];
    let clientIp = req.header('x-forwarded-for') || req.connection.remoteAddress;
    if (!clientIp) {
        return res.json('Error');
    }
    if (enable
        && paths.some((path) => (path === req.originalUrl))) {

        let blacklist = blacklist || [];
        if (blacklist.some((ip) => clientIp.match(ip) !== null)) {
            return res.json({ status: 401, error: 'Your IP is black-listed !'});
        }
        let whitelist = whitelist || [];
        if (whitelist.length === 0 || whitelist.some((ip) => clientIp.match(ip) !== null)) {
            next();
            return;
        } else {
            return res.json({ status: 401, error: 'Your IP is not listed !'});
        }
    }
    next();
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X