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

584voto

topek Points 8288

Dans votre request il existe une propriété appelée connection qui est un net.Stream objet. L'objet net.Stream possède une propriété remoteAddress Vous devriez donc être en mesure d'obtenir l'IP avec cet appel :

request.connection.remoteAddress

Voir la documentation pour http et net

EDIT

Comme le souligne @juand dans les commentaires, la méthode correcte pour obtenir l'IP distante, si le serveur est derrière un proxy, est la suivante request.headers['X-Forwarded-For']

11 votes

Cela me donne une adresse IP différente de celle que me donne whatismyip.com. Pourquoi cela ?

0 votes

Vous voulez dire que vous vous connectez à partir de localhost ? Qu'est-ce que cela vous donne ?

4 votes

Mon service API est installé sur un no.de instance. Lorsque j'essaie d'y accéder depuis mon ordinateur, j'obtiens une adresse IP de "10.2.XXX.YYY" alors que mon adresse IP réelle est "67.250.AAA.BBB".

512voto

Edmar Miyake Points 2645
var ip = req.headers['x-forwarded-for'] || 
     req.connection.remoteAddress || 
     req.socket.remoteAddress ||
     req.connection.socket.remoteAddress;

Notez que parfois vous pouvez obtenir plus d'une adresse IP dans req.headers['x-forwarded-for'].

Le format général du champ est le suivant :

x-for : client, proxy1, proxy2, proxy3

où la valeur est une liste d'adresses IP séparées par des virgules et des espaces, la plus à gauche étant le client d'origine, et chaque proxy successif qui a transmis la demande ajoutant l'adresse IP d'où il a reçu la demande. Dans cet exemple, la requête est passée par proxy1 , proxy2 et ensuite proxy3 . proxy3 apparaît comme l'adresse distante de la demande.

19 votes

Mais comment empêcher l'usurpation de ces en-têtes ?

2 votes

Si vous êtes derrière un proxy qui définit ces en-têtes, ils seront ajoutés à la fin de la liste d'adresses. La dernière adresse sera définie par votre proxy, les précédentes peuvent provenir d'équilibreurs de charge précédents ou être "usurpées" par le client. J'imagine que vous pouvez également demander à votre LB d'écraser l'en-tête.

8 votes

Cela fonctionne généralement bien, mais pour une raison quelconque, j'ai récemment reçu le message d'erreur "Cannot read property 'remoteAddress' of undefined" parce qu'apparemment tout était nul/indéfini, notamment req.connection.socket . Je ne suis pas sûr de la raison/des conditions qui font que c'est le cas, mais il serait bon de le vérifier. req.connection.socket existe pour éviter que votre serveur ne se bloque si cela se produit.

136voto

Jason Sebring Points 4309

Si vous utilisez l'express...

req.ip

Je regardais ça et puis je me suis dit, attends, j'utilise l'express. Duh.

35voto

Val Neekman Points 1238

Vous pouvez rester SEC et utiliser simplement noeud-ipware qui prend en charge à la fois IPv4 et IPv6 .

Installer :

npm install ipware

Dans votre application.js ou middleware :

var get_ip = require('ipware')().get_ip;
app.use(function(req, res, next) {
    var ip_info = get_ip(req);
    console.log(ip_info);
    // { clientIp: '127.0.0.1', clientIpRoutable: false }
    next();
});

Il fera de son mieux pour obtenir l'adresse IP de l'utilisateur ou retournera 127.0.0.1 pour indiquer qu'il n'a pas pu déterminer l'adresse IP de l'utilisateur. Jetez un coup d'œil à la README pour les options avancées.

43 votes

"ou renvoie 127.0.0.1 pour indiquer qu'il n'a pas pu déterminer l'adresse IP de l'utilisateur" Il y a une grande différence entre 127.0.0.1 et inconnu...

6 votes

Il a renvoyé quelque chose de bizarre pour moi :ffff:(not my IP address) lorsqu'il est testé depuis Heroku. La réponse de @edmar-miyake fonctionne correctement pour moi.

0 votes

Je me demande quelle serait l'adresse IP si l'on utilisait la recherche droite-gauche dans le cas de 'x-forwarded-for'. var ip_info = get_ip(req, right_most_proxy=True), car dans certaines configurations, l'IP du client peut être l'IP la plus à droite.

24voto

pbojinov Points 372

Vous pouvez utiliser demande-ip pour récupérer l'adresse IP d'un utilisateur. Il gère un grand nombre de cas limites différents, dont certains sont mentionnés dans les autres réponses.

Divulgation : J'ai créé ce module

Installer :

npm install request-ip

Dans votre application :

var requestIp = require('request-ip');

// inside middleware handler
var ipMiddleware = function(req, res, next) {
    var clientIp = requestIp.getClientIp(req); // on localhost > 127.0.0.1
    next();
};

J'espère que cela vous aidera

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