Cómo determinar la dirección IP de un usuario en el nodo
¿Cómo puedo determinar la dirección IP de una solicitud determinada desde un controlador? Por ejemplo (en expreso):
app.post('/get/ip/address', function (req, res) {
// need access to IP address here
})
En tu request
objeto hay una propiedad llamada socket
, que es un net.Socket
objeto. El net.Socket
objeto tiene una propiedad remoteAddress
, por lo tanto deberías poder obtener la IP con esta llamada:
request.socket.remoteAddress
(si la versión de su nodo es inferior a 13, utilice la versión obsoleta ahora request.connection.remoteAddress
)
EDITAR
Como @juand señala en los comentarios, el método correcto para obtener la IP remota, si el servidor está detrás de un proxy, esrequest.headers['x-forwarded-for']
EDITAR 2
Cuando se usa express
con Node.js:
Si lo configura app.set('trust proxy', true)
, req.ip
devolverá la dirección IP real incluso si está detrás del proxy. Consulta la documentación para más información.
var ip = req.headers['x-forwarded-for'] ||
req.socket.remoteAddress ||
null;
Tenga en cuenta que a veces puede obtener más de una dirección IP en req.headers['x-forwarded-for']
. Además, x-forwarded-for
no siempre se establecerá un encabezado, lo que puede generar un error.
El formato general del campo es:
x-reenviado-para: client, proxy1, proxy2, proxy3
donde el valor es una lista de direcciones IP separadas por comas y espacios, la más a la izquierda es el cliente original y cada proxy sucesivo que pasó la solicitud agrega la dirección IP de donde recibió la solicitud. En este ejemplo, la solicitud pasó por proxy1
, proxy2
y luego proxy3
. proxy3
aparece como dirección remota de la solicitud.
Esta es la solución sugerida por Arnav Gupta con una solución que Martin sugiere a continuación en los comentarios para los casos en los que x-forwarded-for
no está configurada:
var ip = (req.headers['x-forwarded-for'] || '').split(',').pop().trim() ||
req.socket.remoteAddress
Sugerencia usando JS moderno:
- Procesando
x-forwarded-for
solo si está configurado, si es así, tome la primera dirección. - otros parámetros utilizan encadenamiento opcional (?.)
const parseIp = (req) =>
req.headers['x-forwarded-for']?.split(',').shift()
|| req.socket?.remoteAddress
console.log(parseIp(req))
// => 127.0.0.1
Si usas expreso...
req.ip
Estaba buscando esto y pensé: espera, estoy usando express. Duh.
Puede permanecer SECO y simplemente usar node-ipware que admita IPv4 e IPv6 .
Instalar:
npm install ipware
En su app.js o middleware:
var getIP = require('ipware')().get_ip;
app.use(function(req, res, next) {
var ipInfo = getIP(req);
console.log(ipInfo);
// { clientIp: '127.0.0.1', clientIpRoutable: false }
next();
});
Hará el mejor intento para obtener la dirección IP del usuario o regresará 127.0.0.1
para indicar que no pudo determinar la dirección IP del usuario. Eche un vistazo al archivo README para ver las opciones avanzadas.
Puede utilizar request-ip para recuperar la dirección IP de un usuario. Maneja bastantes de los diferentes casos extremos, algunos de los cuales se mencionan en las otras respuestas.
Divulgación: creé este módulo
Instalar:
npm install request-ip
En tu aplicación:
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();
};
Espero que esto ayude