hapi-geo-locate
Version:
Provide IP geo location for incoming requests in hapi
220 lines (162 loc) • 6.84 kB
Markdown
<div align="center">
<img width="471" style="max-width:100%;" src="https://github.com/futurestudio/hapi-geo-locate/blob/master/media/hapi-geo-locate.png?raw=true" alt="hapi-geo-locate logo">
<br/>
<br/>
<p>
A hapi plugin to geo-locate requests
</p>
<br/>
<p>
<a href="#installation"><strong>Installation</strong></a> ·
<a href="#usage"><strong>Usage</strong></a> ·
<a href="#plugin-registration-options"><strong>Plugin Options</strong></a> ·
<a href="#supported-proxies-and-proxy-headers"><strong>Proxies and Headers</strong></a>
</p>
<br/>
<br/>
<p>
<a href="https://travis-ci.org/futurestudio/hapi-geo-locate"><img src="https://travis-ci.org/futurestudio/hapi-geo-locate.svg?branch=master" alt="Build Status"></a>
<a href="https://snyk.io/test/github/futurestudio/hapi-geo-locate"><img src="https://snyk.io/test/github/futurestudio/hapi-geo-locate/badge.svg" alt="Known Vulnerabilities"></a>
<a href="https://www.npmjs.com/package/hapi-geo-locate"><img src="https://img.shields.io/npm/v/hapi-geo-locate.svg" alt="Latest Version"></a>
<a href="https://www.npmjs.com/package/hapi-geo-locate"><img src="https://img.shields.io/npm/dm/hapi-geo-locate.svg" alt="Total Downloads"></a>
</p>
<p>
<em>Follow <a href="http://twitter.com/marcuspoehls">@marcuspoehls</a> for updates!</em>
</p>
</div>
---
<p align="center"><sup>Development of this hapi plugin is supported by <a href="https://futurestud.io">Future Studio University 🚀</a></sup>
<br><b>
Join the <a href="https://futurestud.io/university">Future Studio University and Skyrocket in Node.js</a></b>
</p>
---
## Introduction
A hapi plugin to geo locate requests by IP and provide `request.location` in your route handlers. The plugin uses [ipinfo.io](http://ipinfo.io/) for the IP geo location.
## Requirements
> **hapi v19 (or later)** and **Node.js v12 (or newer)**
This plugin requires **hapi v19** (or later) and **Node.js v12 or newer**.
### Compatibility
| Major Release | [hapi.js](https://github.com/hapijs/hapi) version | Node.js version |
| --- | --- | --- |
| `v4` | `>=17 hapi` | `>=12` |
| `v3` | `>=17 hapi` | `>=8` |
| `v2` | `<=16 hapi` | `>=8` |
## Installation
Add `hapi-geo-locate` as a dependency to your project:
```bash
npm i hapi-geo-locate
```
### Using hapi v17 or v18?
Use the `3.x` release line:
```bash
npm i hapi-geo-locate@3
```
### Do you use hapi v16 (or lower)?
Use the `2.x` release of `hapi-geo-locate` with hapi v16 support. Later versions are only compatible with hapi v17 and v18.
```bash
npm i hapi-geo-locate@2
```
## Usage
The most straight forward way to register the `hapi-geo-locate` plugin:
```js
await server.register({
plugin: require('hapi-geo-locate')
})
// went smooth like dark chocolate :)
// Within your route handler functions, you can access the location like this
server.route({
method: 'GET',
path: '/',
handler: (request, h) => {
const location = request.location
// use client location
return location
}
})
```
## Plugin Registration Options
The following plugin options allow you to customize the default behavior of `hapi-geo-locate`:
- **enabledByDefault**: `(boolean)`, default: `true` — by default, the plugin geo locates the request by IP on every request
- **authToken**: `(string)`, no default — the API token to authenticate requests against the IPinfo API
```js
await server.register({
plugin: require('hapi-geo-locate'),
options: {
enabledByDefault: false
authToken: 'your-ipinfo-api-token'
}
})
// Within your route handler functions, you can access the location like this
server.route({
method: 'GET',
path: '/',
handler: (request, h) => {
const location = request.location // will be undefined
return h.response(location)
}
})
```
## Route Handler Options
The following plugin options on individual route handlers allow you to customize the behavior of `hapi-geo-locate`:
- **enabled**: `(boolean)` — tells the plugin to enable (`true`) or disable (`false`) geo location for the request by IP
- **fakeIP**: `(string)` — tells the plugin to use the defined IP address to geo locate the request (by this IP)
The plugin configuration can be customized for single routes using the `hapi-geo-locate` key:
```js
server.register({
plugin: require('hapi-geo-locate') // enabled by default
})
// Within your route handler functions, you can access the location like this
server.route({
method: 'GET',
path: '/',
handler: (request, h) => {
const location = request.location
// use the location
return location
},
config: {
plugins: {
'hapi-geo-locate': {
enabled: true,
fakeIP: '8.8.8.8'
}
}
}
})
```
## Supported Proxies and Proxy Headers
`hapi-geo-locate` supports all proxies that [request-ip](https://github.com/pbojinov/request-ip) does:
- `X-Client-IP`
- `X-Forwarded-For`, picking the first, client IP if the request went through multiple proxies.
- `X-Forwarded`, `Forwarded-For` and `Forwarded` as variations of `X-Forwarded-For`
- `CF-Connecting-IP`
- `True-Client-Ip`
- `X-Real-IP`
- `X-Cluster-Client-IP`
- and all the `request.[connection|socket|info].remoteAddress` variations.
If the IP address cannot be found, `null` is returned.
Running your application behind a (reverse) proxy like nginx, the client’s IP address gets reset to localhost.
You can grab the actual request IP to your app using an HTTP header.
`hapi-geo-locate` uses the [request-ip](https://github.com/pbojinov/request-ip) package to determine the external IP address. This package supports
all common HTTP headers and ways to get the request’s IP. Awesome!
You should be safe in any way :)
## Feature Requests
Do you miss a feature? Please don’t hesitate to
[create an issue](https://github.com/futurestudio/hapi-geo-locate/issues) with a short description of your
desired addition to this plugin.
## Links & Resources
- [hapi tutorial series (100+ tutorials)](https://futurestud.io/tutorials/hapi-get-your-server-up-and-running)
- [node-ipinfo](https://github.com/IonicaBizau/node-ipinfo): Node.js wrapper for the [ipinfo.io](http://ipinfo.io) API
- [request-ip](https://github.com/pbojinov/request-ip): Node.js module for retrieving a request’s IP address
## Contributing
1. Create a fork
2. Create your feature branch: `git checkout -b my-feature`
3. Commit your changes: `git commit -am 'Add some feature'`
4. Push to the branch: `git push origin my-new-feature`
5. Submit a pull request 🚀
## License
MIT © [Future Studio](https://futurestud.io)
---
> [futurestud.io](https://futurestud.io) ·
> GitHub [@futurestudio](https://github.com/futurestudio/) ·
> Twitter [@futurestud_io](https://twitter.com/futurestud_io)