# Device Fingerprint

![NPM Version](https://img.shields.io/npm/v/@guardhivefraudshield/device-fingerprint)
![NPM Downloads](https://img.shields.io/npm/dm/@guardhivefraudshield/device-fingerprint)

device-fingerprint is the world's best browser fingerprinting JavaScript library. While not (yet?) as good, it's a free open source alternative to the market leading [device-fingerprint](https://github.com/guardhive/fraudshield_devicefingerprint). It is easy to use and easily extendable.

device-fingerprint is open source (MIT).

🙏 Please don't do evil. device-fingerprint is meant to be used for good. Use this to prevent scammers and spammers for example. If you see this library being used for evil, contact me.

## Simple usage from CDN

Transpiled bundles are available now on [JSDelivr](https://www.jsdelivr.com/).

Supported module formats:

-   UMD: https://cdn.jsdelivr.net/npm/@guardhivefraudshield/device-fingerprint/dist/index.umd.js
-   CommonJS: https://cdn.jsdelivr.net/npm/@guardhivefraudshield/device-fingerprint/dist/index.cjs.js
-   ESM: https://cdn.jsdelivr.net/npm/@guardhivefraudshield/device-fingerprint/dist/index.esm.js

### And on the web page:

```javascript
<script src="https://cdn.jsdelivr.net/npm/@guardhivefraudshield/device-fingerprint/dist/index.umd.js"></script>
<script>
DeviceFingerprint.getFingerprint().then(
    function(data) {
        console.log(data);
    }
);
</script>

<!-- or -->

<script>
import('https://cdn.jsdelivr.net/npm/@guardhivefraudshield/device-fingerprint/dist/index.esm.js')
.then(({ getFingerprint }) => {
    getFingerprint().then((data) => { console.log(data)})
})
</script>

```

You can also call `DeviceFingerprint.getFingerprintData()` to get a full JSON object with all its components.

## Options

You can use the `setOption` method to change the behavior of the library. Currently it takes only one option.

| option  | type     | example                             | what it does                                                                                        |
| ------- | -------- | ----------------------------------- | --------------------------------------------------------------------------------------------------- |
| exclude | string[] | ['webgl', 'system.browser.version'] | removes components from the fingerprint hash. An excluded top-level component improves performance. |

example usage:

```
DeviceFingerprint.setOption('exclude', ['webgl', 'system.browser.version'])
```

## Install with NPM

Installing from NPM:

```bash
npm install @guardhivefraudshield/device-fingerprint
```

and in your code

```javascript
import { getFingerprint } from "@guardhivefraudshield/device-fingerprint";
```

To implement device-fingerprint in a Next.js app, you can use a component [like this](examples/nextjs.tsx).

## Build it yourself

Clone this repo and then run

```
yarn install
yarn build
```

## Components included in fingerprint

-   audio fingerprint
-   canvas fingerprint
-   webgl fingerprint
-   available fonts and how they render
-   videocard
-   browser languages and time zone
-   browser permissions
-   available plugins
-   a ton of screen details including media queries
-   and a bunch of smaller things
