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

3voto

Kirill Chatrov Points 642

Si vous avez plusieurs adresses IP, cela fonctionne pour moi :

var ipaddress = (req.headers['x-forwarded-for'] || 
req.connection.remoteAddress || 
req.socket.remoteAddress || 
req.connection.socket.remoteAddress).split(",")[0];

3voto

cnttlc Points 12

Obtenir simplement une adresse IP distante dans nodejs :

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

3voto

Nino Filiu Points 3662

req.connection a été déprécié depuis node@12.12.0 . Utilisation de req.connection.remoteAddress pour obtenir l'IP du client peut encore fonctionner mais est déconseillé.

Heureusement, req.socket.remoteAddress est là depuis node@0.5.10 et constitue un remplacement parfait :

La représentation en chaîne de l'adresse IP distante. Par exemple, '74.125.127.100' o '2001:4860:a005::68' . La valeur peut être undefined si la socket est détruite (par exemple, si le client s'est déconnecté).

3voto

Deminetix Points 286

Il y avait beaucoup d'excellents points ici, mais rien d'exhaustif, alors voici ce que j'ai fini par utiliser :

function getIP(req) {
  // req.connection is deprecated
  const conRemoteAddress = req.connection?.remoteAddress
  // req.socket is said to replace req.connection
  const sockRemoteAddress = req.socket?.remoteAddress
  // some platforms use x-real-ip
  const xRealIP = req.headers['x-real-ip']
  // most proxies use x-forwarded-for
  const xForwardedForIP = (() => {
    const xForwardedFor = req.headers['x-forwarded-for']
    if (xForwardedFor) {
      // The x-forwarded-for header can contain a comma-separated list of
      // IP's. Further, some are comma separated with spaces, so whitespace is trimmed.
      const ips = xForwardedFor.split(',').map(ip => ip.trim())
      return ips[0]
    }
  })()
  // prefer x-forwarded-for and fallback to the others
  return xForwardedForIP || xRealIP || sockRemoteAddress || conRemoteAddress
}

2voto

Misha Nasledov Points 466

Je me rends compte que cette question a été traitée à mort, mais voici une version ES6 moderne que j'ai écrite et qui suit les normes eslint de la base airbnb.

const getIpAddressFromRequest = (request) => {
  let ipAddr = request.connection.remoteAddress;

  if (request.headers && request.headers['x-forwarded-for']) {
    [ipAddr] = request.headers['x-forwarded-for'].split(',');
  }

  return ipAddr;
};

L'en-tête X-Forwarded-For peut contenir une liste d'adresses IP de proxy séparées par des virgules. L'ordre est client,proxy1,proxy2,...,proxyN. Dans le monde réel, les gens implémentent des proxys qui peuvent fournir ce qu'ils veulent dans cet en-tête. Si vous êtes derrière un équilibreur de charge ou autre, vous pouvez au moins être sûr que la première IP de la liste est au moins le proxy par lequel une requête est passée.

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