npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

finger-printer

v1.1.1

Published

An npm module to connect to the Finger Printer app.

Downloads

1

Readme

Finger-Printer

Finger Printer is a mobile application that can authenticate desktop applications using a device's fingerprint reader.

Download the app here.

Checkout the npm repository here.

Documentation

NPM Package

To install: npm install finger-printer

To require: let fingerprinter = require('finger-printer');

Locate Device

Add Device

Callback Parameters:

  • device describes the device as an object with three variables.

| device.endpoint | device.hardwareID | device.deviceName | | ------------- | ------------- |------------- | | describes the ip address as a string | a unique string describing the device | a name representing the device | | "10.0.1.23" | "9696a472835e0d3d" | "SAMSUNG-SM-G930V" |

Example:

fingerprinter.on('addDevice', function(device) {
     //add device
});

Remove Device

Callback Parameters

  • endpoint

| endpoint | | ------------- | | describes the ip address as a string | | "10.0.1.23" |

Example:

fingerprinter.on('removeDevice', function(endpoint) {
     //remove device
});

Find Devices

Example:

fingerprinter.findDevices();

Pair Device

Function Parameters:

  • endpoint

| endpoint | | ------------- | | describes the ip address as a string | | "10.0.1.23" |

  • applicationID

| applicationID | | ------------- | | unique string associated to an application | | "ASDF34JDBN2H..." |

  • label

| label | | ------------- | | A string describing the application | | "My Application" |

  • username

| username | | ------------- | | Desired username for user | | "User1234" |

  • salt

| salt | | ------------- | | A random string that is included during the hashing process of the pairing | | "My Application" |

Callback Parameters:

  • success

| success | | ------------- | | describes the success of the pairing process | | true | false |

  • data describes the data associated with the request.

| data.success | data.username | data.command | data.message| data.uniqueKey | data.hardwareID | | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | | describes the success of the pairing process | username paired with application | request command | additional message data | uniqueKey associated with user and application | a unique string describing the device | | true | false | "user1234" | "pair" | "ran pair" | "BF5C9D7ASDF32NDFNU31..." | "9696a472835e0d3d" |

Example:

fingerprinter.pair(endpoint, applicationID, label, username, salt, function(success, data) {
     if (success) {
          success();
     } else if (data.message == "already paired") {
          error("Device is already paired with this application. Maybe you want to login?");
     } else if (data.message == "i am already connected") {
          error("Device became unavailable.");
     } else if (data.message == "close" || data.message == "error" || data.message == "ran pair") {
          error("Device timed out. Please try again.");
     } else {
          error("Unexpected response. Please contact an administrator.");
     }
});

Authenticate Device

Function Parameters:

  • endpoint

| endpoint | | ------------- | | describes the ip address as a string | | "10.0.1.23" |

  • applicationID

| applicationID | | ------------- | | unique string associated to an application | | "ASDF34JDBN2H..." |

Callback Parameters:

  • success

| success | | ------------- | | describes the success of the authentication process | | true | false |

  • data describes the data associated with the request.

| data.success | data.username | data.command | data.message| data.uniqueKey | data.hardwareID | | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | | describes the success of the authentication process | username authenticated with application | request command | additional message data | uniqueKey associated with user and application | a unique string describing the device | | true | false | "user1234" | "authenticate" | "ran authentication" | "BF5C9D7ASDF32NDFNU31..." | "9696a472835e0d3d" |

Example:

fingerprinter.authenticate(endpoint, applicationID, function(success, data) {
     if (success) {
          success();
     } else if (data.message == "i do not know that applicationID") {
          error("Device does not know this application. Maybe you want to register?");
     } else if (data.message == "i am already connected") {
          error("Device became unavailable.");
     } else if (data.message == "close" || data.message == "error" || data.message == "ran authentication") {
         error("Device timed out. Please try again.");
     } else {
          error("Unexpected response. Please contact an administrator.");
     }
});

Finger Printer Protocol

Protocol Guidelines

  • The Finger Printer socket will timeout after 30 seconds.
  • All Finger Printer sockets communicate on port 61597.
  • Only one application can connect to Finger Printer at a time.
  • If not already connected with another device, Finger Printer will send a knock-knock response per connection.
  • If already connected, Finger Printer will respond with {"success":false,"message":"i am already connected"} and disconnect.

Requests

knock-knock

knock-knock responds with a unique hardwareID for the device and deviceName describing the devices name to the network. If not already connected with another device, Finger Printer will automatically respond with a knock-knock response when a connection is initialized.

Request:

{
     "command": "knock-knock"
}

Response:

{
     "success": true,
     "command": "knock-knock",
     "hardwareID": "9696a472835e0d3d",
     "deviceName": "SAMSUNG-SM-G930V"
}

pair

A pair request will add a new user to the Finger Printer device's local database. The user's application will also be added to the local database if not done so already. A user can only be paired once.

Parameters:

  • applicationID is a unique string used to identify an application for authentication requests. This is hidden from the user.

  • username is the given username of the user.

  • label is the name of the application. This is displayed to the user.

  • salt is a random string that is included during the hashing process of the pairing.

Request:

{
     "command": "pair",
     "applicationID": "213af32",
     "label": "Example Application",
     "username": "user1234",
     "salt": "ejin2ns12"
}

Successful Response:

{
     "success": true,
     "username": "user1234",
     "command": "pair",
     "message": "ran pair",
     "uniqueKey": "BF5C9D78A667D8E8D8BD741422AB6027CA7E7A72F8FF3EAB9AF84CC32C841214",
     "hardwareID": "9696a472835e0d3d"
}

Unsuccessful Response (already paired):

{
     "success": false,
     "command": "pair",
     "message": "already paired"
}

Treat the uniqueKey and hardwareID as a password. Hash and salt it in your database. Every successful authentication response will contain an identical uniqueKey and hardwareID.

authenticate

An authenticate request will authenticate an application. Because Finger Printer can contain multiple users per application, the username to authenticate with will be selected by the user in the app.

Parameters:

  • applicationID is a unique string used to identify an application for authentication requests. This is hidden from the user.

Request:

{
     "command": "authenticate",
     "applicationID": "213af32"
}

Successful Response:

{
     "success": true,
     "username": "user1234",
     "command": "authenticate",
     "message": "ran authentication",
     "uniqueKey": "BF5C9D78A667D8E8D8BD741422AB6027CA7E7A72F8FF3EAB9AF84CC32C841214",
     "hardwareID": "9696a472835e0d3d"
}

Unsuccessful Response: (Unknown applicationID)

{
     "success": false,
     "command": "authenticate",
     "message": "i do not know that applicationID"
}

Treat the uniqueKey and hardwareID as a password. Hash and salt it in your database. Every successful authentication response will contain an identical uniqueKey and hardwareID.

Other Responses

Unkown Command:

{
     "success": false,
     "message": "i do not understand that command"
}

Internal Error:

{
     "success": false,
     "message": "java.lang.IllegalStateException: Not a JSON Object...'"
}