Retrieving the Client's IP Address in Express.js
Express.js, a popular Node.js framework, simplifies the process of building web applications. To obtain the client's IP address within an Express application, you can access the req.ip
property provided by the framework. However, in scenarios where your application is behind a proxy or load balancer, the client's IP might be stored in the X-Forwarded-For
header. To accurately retrieve the client's IP in such cases, consider the following approach:
const express = require('express');
const app = express();
app.use((req, res, next) => {
const clientIp = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
console.log(`Client IP: ${clientIp}`);
next();
});
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
In this setup, the middleware function captures the client's IP address from the X-Forwarded-For
header if present; otherwise, it falls back to req.connection.remoteAddress
. This ensures that you obtain the correct IP address regardless of your application's deployment environment.
Enhancing IP Data with IPQuery
Once you've obtained the client's IP address, enriching this data with geolocation and risk assessment information can provide valuable insights. IPQuery is a robust API designed for developers, offering features such as VPN detection, geolocation, and threat intelligence. With support for both IPv4 and IPv6, IPQuery delivers fast lookups with low latency, making it an excellent choice for real-time applications.
Setting Up IPQuery in Your Express Application
To integrate IPQuery into your Express application, follow these steps:
- Install the Axios HTTP Client
Axios is a promise-based HTTP client for Node.js, facilitating HTTP requests. Install it using npm:
npm install axios
- Create a Function to Query IPQuery
Develop a function that sends a request to the IPQuery API and processes the response:
const axios = require('axios');
async function getIpInfo(ip) {
try {
const response = await axios.get(`https://api.ipquery.io/${ip}?format=json`);
return response.data;
} catch (error) {
console.error(`Error fetching IP information: ${error}`);
return null;
}
}
- Integrate IPQuery into Your Middleware
Modify your Express middleware to utilize the getIpInfo
function:
app.use(async (req, res, next) => {
const clientIp = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
const ipInfo = await getIpInfo(clientIp);
if (ipInfo) {
console.log(`Client IP: ${clientIp}`);
console.log(`Location: ${ipInfo.location.city}, ${ipInfo.location.country}`);
console.log(`ISP: ${ipInfo.isp.org}`);
console.log(`Risk Score: ${ipInfo.risk.risk_score}`);
}
next();
});
This middleware retrieves the client's IP address, fetches detailed information from IPQuery, and logs pertinent details such as location, ISP, and risk score.
Understanding IPQuery's Response Structure
IPQuery provides a comprehensive JSON response containing various data points:
{
"ip": "1.1.1.1",
"isp": {
"asn": "AS13335",
"org": "Cloudflare, Inc.",
"isp": "Cloudflare, Inc."
},
"location": {
"country": "Australia",
"country_code": "AU",
"city": "Sydney",
"state": "New South Wales",
"zipcode": "1001",
"latitude": -33.854548400186665,
"longitude": 151.20016200912815,
"timezone": "Australia/Sydney",
"localtime": "2024-09-03T22:22:52"
},
"risk": {
"is_mobile": false,
"is_vpn": false,
"is_tor": false,
"is_proxy": false,
"is_datacenter": true,
"risk_score": 0
}
}
Key components include:
- IP: The queried IP address.
- ISP: Information about the Internet Service Provider, including ASN, organization, and ISP name.
- Location: Geographical data such as country, city, state, and coordinates.
- Risk: Indicators of potential risks, including whether the IP is associated with mobile networks, VPNs, Tor nodes, proxies, data centers, and an overall risk score.
For more detailed information, refer to the IPQuery documentation.
Top comments (0)