DEV Community

Cover image for IP of Requesting API
masyanja
masyanja

Posted on

IP of Requesting API

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');
});
Enter fullscreen mode Exit fullscreen mode

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:

  1. 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
Enter fullscreen mode Exit fullscreen mode
  1. 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;
     }
   }
Enter fullscreen mode Exit fullscreen mode
  1. 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();
   });
Enter fullscreen mode Exit fullscreen mode

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
  }
}
Enter fullscreen mode Exit fullscreen mode

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)