{"_id":"jwt-async","_rev":"26-51ccc559a8b9c87617ce8693234ef027","name":"jwt-async","time":{"modified":"2022-06-19T07:33:43.439Z","created":"2014-12-23T07:25:55.410Z","1.0.0":"2014-12-23T07:25:55.410Z","1.0.0-rc.1":"2014-12-23T08:03:08.822Z","1.0.0-beta1":"2014-12-23T08:05:31.548Z","1.0.0-beta2":"2014-12-23T08:07:55.278Z","1.0.1":"2014-12-24T08:46:19.293Z","1.1.0":"2015-03-11T01:25:14.425Z","1.1.1":"2015-03-11T01:32:12.117Z","1.1.2":"2015-03-11T01:44:59.341Z"},"maintainers":[{"name":"patbaker82","email":"patricksbaker@gmail.com"}],"dist-tags":{"latest":"1.1.2"},"description":"JSON Web Token (JWT) with asynchronicity","readme":"# jwt-async [![Build Status](https://secure.travis-ci.org/patbaker82/node-jwt-async.png)](http://travis-ci.org/patbaker82/node-jwt-async)\n\nAn async implementation of [JSON Web Tokens (JWT)](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html).\n\nThis implementation was developed against `draft-ietf-oauth-json-web-token-32`.  Note that this library leverages core node modules to implement the JWT spec.  The only dependency is lodash, which is used to implement some conveniences.\n\n## Why?\n\nIn my search I found that not all node JWT implementations were built with async first in mind.  Additionally I wanted something that allowed for more flexability, but was still able to do the heavy lifting.\n\nIt's interesting to note that Node's Crypto.create methods are all **synchronous**.  However the writeable streams to these methods are **asynchronous**.  That means, with this library, the data you want to sign will be **asynchronously** streamed to the relevant crypto methods.  The crypto methods themselves do not perform any heavy crypto computation, therefore its quite fast.\n\n## Installation\n\n```bash\n$ npm install jwt-async\n```\n\n## Testing\n\n```bash\n$ npm test\n```\n\n## Example Usage\n\n### Simple example\n\n```javascript\nvar JWT = require('jwt-async');\n\n// Create jwt instance\n// Defaults to HS256 algorithm\nvar jwt = new JWT();\njwt.setSecret('secret');\n\n// Sign the jwt\njwt.sign({someClaim: 'data'}, function (err, data) {\n  if (err) console.log(err);\n\n  // Print signed JWT\n  // Paste it into http://www.jwt.io\n  console.log(data);\n\n  // Verify it\n  jwt.verify(data, function (err, data) {\n    if (err) console.log(err);\n\n    // Print the verified JWT\n    // This is an object\n    console.log(data);\n  });\n});\n```\n\n### Example with options hash\n\nFor sake of claity, the options hash is used to set the jwt instance up with some boilerplate.  Meaning, when signing or verifying it will use the options defined.  These can be changed via instance methods documented below. ie `jwt.setSecret`, `jwt.setPrivateKey`, `jwt.setValidations`, `jwt.setClaims`, etc.\n\n```javascript\nvar JWT = require('jwt-async');\n\nvar options = {\n  // Default crypto per sign\n  crypto: {\n    algorithm: 'HS512',\n    secret: 'secret'\n  },\n  // Default claims per sign\n  claims: {\n    // Automatically set 'Issued At' if true (epoch), or set to a number\n    iat: true,\n    // Set 'Not Before' claim\n    nbf: Math.floor(Date.now() / 1000) - 60,\n    // Set 'Expiration' claim\n    exp: Math.floor(Date.now() / 1000) + 60,\n    // Set a custom claim\n    custom: 'this is a custom claim'\n  },\n  // Default validations per verify\n  validations: {\n    custom: function (claims, next) {\n      // Do custom validation of claims\n      // IE verify audience with database, etc\n      if (claims.custom === 'this is a custom claim') {\n        next();\n      } else {\n        next(new Error('BOOM'));\n      }\n    },\n    exp: true,\n    nbf: true\n  }\n};\n\n// Create jwt instance\nvar jwt = new JWT(options);\n\n// More claims that will be merged with the default options\n// These will not persist since we're sending them directly to the sign method\nvar moreClaims = {\n  anotherField: 'this is another field'\n}\n\n// Sign the jwt\njwt.sign(moreClaims, function (err, data) {\n  if (err) console.log(err);\n\n  // Print signed JWT\n  // Paste it into http://www.jwt.io\n  console.log(data);\n\n  // Verify it\n  jwt.verify(data, function (err, data) {\n    if (err) console.log(err);\n\n    // Print the verified JWT\n    // This is an object\n    console.log(data);\n  });\n});\n```\n\n### Example using bluebird promises\n\nIf you don't like callbacks, then feel free to use promises.  Here's how you can use this library with a promise library such as bluebird.\n\n```javascript\nvar JWT = require('jwt-async');\nvar BPromise = require('bluebird');\n\nvar jwt = BPromise.promisifyAll(new JWT());\njwt.setSecret('secret');\n\njwt.signAsync()\n  .then(function (signed) {\n    return jwt.verifyAsync(signed);\n  })\n  .then(function (claims) {\n    console.log(claims);\n  })\n  .catch(JWT.JWTError, function (e) {\n    console.log(e);\n  });\n```\n\n## API\n\n### constructor\n\n#### new JWT([options])\n\nThe JWT constructor can take an optional options hash defining some boiler plate for the instance returned.  Once the instance is created, these options can be easily changed by executed the appropriate instance method.  Without an options hash the JWT instance returned will default to HS256 (HMAC) JWT signing.\n\n`options`\n\nThe only default set, without options, is the algorithm.  Expect everything else either to be not set or set to false.  Also, if its not obvious, claims are for the signing process and validations are for the verify process.\n\n* crypto\n  * algorithm (string) - See below for acceptable algorithms\n  * secret (string|buffer) - If using `HS*`, this is the secret used for the symmetric signing\n  * privateKey (string|buffer) - If using `RS*`, `ES*` this is the private key used for signing JWT's\n  * publicKey (string|buffer) - If using `RS*`, `ES*` this is the public key used for verifying JWT's\n* claims\n  * iat (boolean|number) If true will set epoch, or can be passed a number if you want something more custom\n  * exp (number) The time, typically epoch, for when the JWT should not be valid AFTER\n  * nbf (number) The time, typically epoch, for when the JWT should not be valid BEFORE\n* validations\n  * exp (boolean) If true, the JWT's exp will be validated against the current time in epoch.  If the JWT is > than the current time a JWTExpiredError will be raised.\n  * nbf (boolean) If true, the JWT's nbf will be validated against the current time in epoch.  If the JWT is < than the current time a JWTInvalidBeforeTimeError will be raised.\n  * custom (function (claims, callback)) If a function is set (see example), any custom validation of the claims can be done.  The function must take two args, claims and a callback.  If the callback is called with an argument it will be converted to a JWTValidationError.  Or you can pass a custom Error().\n\n##### Example\n\nWithout options\n```javascript\nvar JWT = require('jwt-async');\nvar jwt = new JWT;\n```\n\nWith options; see above for full example\n```javascript\nvar JWT = require('jwt-async');\nvar jwt = new JWT(options);\n```\n\n### instance methods\n\n#### jwt.sign(claims, callback)\n\n`claims`\n\n* (object) Claims to be used for the **current** signing process; they will not be retained and used for the next sign() invocation.  Note, if claims are passed in they will be merged with the claims defined when the jwt instance was setup with options OR any claims that were set with `jwt.setClaims`.\n\n`callback`\n\n* (function (err, data)) - Standard callback with an error object and data.  The data is the signed JWT.\n\n##### Example\n\n```javascript\n// Without a claims object\njwt.sign(null, function (err, data) {\n  // Log out signed JWT\n  console.log(data);\n});\n\n// With a claims object to be used for this signing\njwt.sign({customClaim: 'this is a custom claim'}, function (err, data) {\n  // Log out signed JWT\n  console.log(data);\n});\n\n// Enable iat\njwt.sign({iat: true}, function (err, data) {\n  // Log out signed JWT\n  console.log(data);\n});\n\n// Disable iat and add nbf\njwt.sign({iat: false, nbf: 1419405977}, function (err, data) {\n  // Log out signed JWT\n  console.log(data);\n});\n```\n\n#### jwt.verify(encodedJWT, callback)\n\n`encodedJWT`\n\n* (string|buffer) - Encoded JWT to be verified.  Make sure the jwt instance object has the appropriate algorithm set and/or secret/public key.\n\n`callback`\n\n* (function (err, data)) - Standard callback with an error object and data.  The data is an object of the decoded & verified JWT.\n\n##### Example\n\n```javascript\njwt.verify(data, function (err, data) {\n  // log Error object\n  if (err) console.log(err);\n\n  // log decoded and verified JWT object\n  console.log(data);\n});\n```\n\n#### jwt.setValidations(validations)\n\nNote that validations are only processed AFTER a jwt is successfully verified.  IE it was verified against the secret or public key.\n\n`validations`\n\n* (object) - Object of validations to be set on the instance.\n\n  * custom (function (claims, callback)) - Set a custom validation function\n  * nbf (boolean) - Set true to validate nbf in JWT\n  * exp (boolean) - Set true to validate exp in JWT\n\n##### Example\n\n```javascript\nvar validations = {\n  custom: function (claims, callback) {\n    // Custom logic here, return an error to fail the validation\n    if (claims.customClaim === 10) callback(new Error('This is bad!');\n\n    // Return successful\n    callback();\n  },\n  nbf: true,\n  exp: true\n};\n\njwt.setValidations(validations);\n```\n\n#### jwt.setPrivateKey(key)\n\n`key`\n\n* (string|buffer) - Set the private key on the jwt instance\n\n##### Example\n\n```javascript\nvar privateKey = fs.readFileSync('ec256-private.pem');\njwt.setPrivateKey(privateKey);\n```\n\n#### jwt.setPublicKey()\n\n`key`\n\n* (string|buffer) - Set the public key on the jwt instance\n\n##### Example\n\n```javascript\nvar publicKey = fs.readFileSync('ec256-public.pem');\njwt.setPrivateKey(publicKey);\n```\n\n#### jwt.setAlgorithm(algorithm)\n\n`algorithm`\n\n* (string) - Set algorithm on the jwt instance; see below for a table of supported algorithms.\n\n##### Example\n\n```javascript\njwt.setAlgorithm('ES512');\n```\n\n#### jwt.setClaims(claims)\n\n`claims`\n\n* (object) - Claims to be set on the jwt instance.  These claims will be used for each signing invocation.  If any claims are passed to sign(), they will be merged with the claims set on the instance.\n\n##### Example\n\n```javascript\nvar claims = {\n  // If iat is set to true, an epoch date will be generated automatically.\n  iat: true,\n  customClaim: 'this is a custom claim'\n};\n\njwt.setClaims(claims);\n```\n#### jwt.isHmac()\n\n* Returns true if algorithm selected is hmac based.\n\n#### jwt.isSign()\n\n* Returns true if algorithm selected uses keys to sign JWT\n\n#### jwt.isUnsecured()\n\n* Returns true if algorithm is set to 'NONE'\n\n#### jwt.getAlgorithm()\n\n* Returns the algorithm set on the instance\n\n#### jwt.getCrypto()\n\n* Returns the underlying node crypto algorithm that will be used\n\n#### jwt.getHeader()\n\n* Returns the set of headers set on the instance\n\n#### jwt.getClaims()\n\n* Returns the set of claims set of the instance\n\n#### jwt.getSecret()\n\n* Returns the secret set on the instance\n\n#### jwt.getPrivateKey()\n\n* Returns the privateKey set on the instance\n\n#### jwt.getPublicKey()\n\n* Returns the public key set on the instance\n\n#### jwt.getValidations()\n\n* Returns the validations set on the instance\n\n### class methods\n\n#### JWT.getSupportedAlgorithms()\n\n* Returns (object) of the supported algorithms that this library supports\n\n#### JWT.base64urlDecode(str)\n#### JWT.base64urlUnescape(str)\n#### JWT.base64urlEncode(str)\n#### JWT.base64urlEscape(str)\n\n### Errors\n\nFor methods that are callback based an error will be set on callback if neccessary.\n\n#### JWTError\n\nJWTError is typically raised for generic type of error events.  IE you tried to sign a JWT with algorithm ES256, but you don't have a privateKey set.\n\n#### JWTValidationError\n\nJWTValidationError is raised when a JWT fails the basic validation process.  IE either the library wasn't able to verify that the JWT signed correctly, it was tampered with, unparseable, etc.\n\n#### JWTExpiredError\n\nJWTExpiredError is raised when the current time is after the JWT claims exp time.  This error also exposes an `expiredAt` property on the error object that reflects when the JWT expired.  Note that you must have exp validations enabled.\n\n#### JWTInvalidBeforeTimeError\n\nJWTInvalidBeforeTimeError is raised when the current time is before the JWT claims nbf time.  This error also exposes an `invalidBefore` property on the error object that reflects when the JWT will be valid after.  Note that you must have nbf validations enabled.\n\n## Algorithms supported\n\nAlgorithm | Description| Supported?\n----------------|----------------|----------------\nnone | No digital signature or MAC performed | ✓\nHS256 | HMAC using SHA-256 | ✓\nHS384 | HMAC using SHA-384 | ✓\nHS512 | HMAC using SHA-512 | ✓\nRS256 | RSASSA-PKCS-v1_5 using SHA-256| ✓\nRS384 | RSASSA-PKCS-v1_5 using SHA-384 | ✓\nRS512 | RSASSA-PKCS-v1_5 using SHA-512 | ✓\nES256 | ECDSA using P-256 and SHA-256 | ✓\nES384 | ECDSA using P-384 and SHA-384 | ✓\nES512 | ECDSA using P-521 and SHA-512 | ✓\nPS256 | RSASSA-PSS using SHA-256 and MGF1 with SHA-256 | ✖\nPS384 | RSASSA-PSS using SHA-384 and MGF1 with SHA-384 | ✖\nPS512 | RSASSA-PSS using SHA-512 and MGF1 with SHA-512 | ✖\n\n# Caveats\n\nX.509 certificate support is not implemented\n\n# License\n\nMIT\n","versions":{"1.0.0-beta2":{"name":"jwt-async","version":"1.0.0-beta2","description":"JSON Web Token (JWT) with asynchronicity","main":"index.js","scripts":{"test":"make keys;./node_modules/.bin/mocha"},"repository":{"type":"git","url":"https://github.com/patbaker82/node-jwt-async"},"keywords":["jwt","async","claims","validations","encode","decode","verify"],"author":{"name":"Patrick Baker","email":"patricksbaker@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/patbaker82/node-jwt-async/issues"},"homepage":"https://github.com/patbaker82/node-jwt-async","devDependencies":{"chai":"^1.10.0","mocha":"^2.0.1","sinon":"^1.12.2","sinon-chai":"^2.6.0"},"engine":"node >= 0.10.0","dependencies":{"lodash":"^2.4.1"},"gitHead":"ab4ea8e2b11d94859f1bfb1432c8dbe269dd7a41","_id":"jwt-async@1.0.0-beta2","_shasum":"5aa87c80eb6c923be3863d4a5aa0b6ea0b658d24","_from":".","_npmVersion":"2.1.10","_nodeVersion":"0.10.33","_npmUser":{"name":"patbaker82","email":"patricksbaker@gmail.com"},"maintainers":[{"name":"patbaker82","email":"patricksbaker@gmail.com"}],"dist":{"shasum":"5aa87c80eb6c923be3863d4a5aa0b6ea0b658d24","tarball":"https://registry.npmjs.org/jwt-async/-/jwt-async-1.0.0-beta2.tgz","integrity":"sha512-ekv6yP/Qn63PjYJgbnUea7YNuuJznQBQPg7vjGtSweOQt59VP9zRQiRAPxpFm/mx6ssvxSJ0jUTUHOrkdvzdcg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHZNY6wgEuhLIhKKltxAV+RLMXyBDMUNelrUIe+L72wTAiB2+1tJ/TeBEZY7Xx11nTC7HGi30Nn8is8ajsBPtXgu+A=="}]}},"1.0.1":{"name":"jwt-async","version":"1.0.1","description":"JSON Web Token (JWT) with asynchronicity","main":"index.js","scripts":{"test":"make keys;./node_modules/.bin/mocha"},"repository":{"type":"git","url":"https://github.com/patbaker82/node-jwt-async"},"keywords":["jwt","async","claims","validations","encode","decode","verify"],"author":{"name":"Patrick Baker","email":"patricksbaker@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/patbaker82/node-jwt-async/issues"},"homepage":"https://github.com/patbaker82/node-jwt-async","devDependencies":{"chai":"^1.10.0","mocha":"^2.0.1","sinon":"^1.12.2","sinon-chai":"^2.6.0"},"engine":"node >= 0.10.0","dependencies":{"lodash":"^2.4.1"},"gitHead":"7058979b6958128dcd8c85399a0efbeb871a850b","_id":"jwt-async@1.0.1","_shasum":"3ea36bf7c5c0c44bededdaabc3193b5d9e18f758","_from":".","_npmVersion":"2.1.11","_nodeVersion":"0.10.33","_npmUser":{"name":"patbaker82","email":"patricksbaker@gmail.com"},"maintainers":[{"name":"patbaker82","email":"patricksbaker@gmail.com"}],"dist":{"shasum":"3ea36bf7c5c0c44bededdaabc3193b5d9e18f758","tarball":"https://registry.npmjs.org/jwt-async/-/jwt-async-1.0.1.tgz","integrity":"sha512-0IGrtK5oWVE9atMa0QtXnTOEELlVFgsgl8RvlTHHgTcBD7EC0Y/3vlf3D+rHnO9dce0ro6lmOPtQE04LaRfTdA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdQW+kOg3NgDcCgmwBOhUP+Vm6nmRBHADi/mGY60zScQIgCul7eSlF7oTpJTO0TJvDr9SWY0r4duuC+jTzVjjfKn0="}]}},"1.1.0":{"name":"jwt-async","version":"1.1.0","description":"JSON Web Token (JWT) with asynchronicity","main":"index.js","scripts":{"test":"make keys;./node_modules/.bin/mocha"},"repository":{"type":"git","url":"https://github.com/patbaker82/node-jwt-async"},"keywords":["jwt","async","claims","validations","encode","decode","verify"],"author":{"name":"Patrick Baker","email":"patricksbaker@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/patbaker82/node-jwt-async/issues"},"homepage":"https://github.com/patbaker82/node-jwt-async","devDependencies":{"chai":"^1.10.0","mocha":"^2.0.1","sinon":"^1.12.2","sinon-chai":"^2.6.0"},"engine":"node >= 0.10.0","dependencies":{"lodash":"^2.4.1"},"gitHead":"268647190d532e0380b0ed1cf8cb8b940c3afc3b","_id":"jwt-async@1.1.0","_shasum":"c81a3a0ae525c70d2b737d99cff0037b10105bf0","_from":".","_npmVersion":"2.6.1","_nodeVersion":"1.4.3","_npmUser":{"name":"patbaker82","email":"patricksbaker@gmail.com"},"maintainers":[{"name":"patbaker82","email":"patricksbaker@gmail.com"}],"dist":{"shasum":"c81a3a0ae525c70d2b737d99cff0037b10105bf0","tarball":"https://registry.npmjs.org/jwt-async/-/jwt-async-1.1.0.tgz","integrity":"sha512-tnATtEBq2a9uAfNo04tUYvw1baLSemg39Z/yMzSIuUvjyHI4ACse4BvcKUdrwMkTMkMGCMJoHLi5+MZeop0OWQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCj1ymBXwnHIeYpEvaqE29oaGfULoaUiGlbmiV1DQzxMAIgZMfLWXqRdb+GHfVPhAbiDqCKmxs/f5+L69nQVDoWEjk="}]}},"1.1.1":{"name":"jwt-async","version":"1.1.1","description":"JSON Web Token (JWT) with asynchronicity","main":"index.js","scripts":{"test":"make keys;./node_modules/.bin/mocha"},"repository":{"type":"git","url":"https://github.com/patbaker82/node-jwt-async"},"keywords":["jwt","async","claims","validations","encode","decode","verify"],"author":{"name":"Patrick Baker","email":"patricksbaker@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/patbaker82/node-jwt-async/issues"},"homepage":"https://github.com/patbaker82/node-jwt-async","devDependencies":{"chai":"^1.10.0","mocha":"^2.0.1","sinon":"^1.12.2","sinon-chai":"^2.6.0"},"engine":"node >= 0.10.0","dependencies":{"lodash":"^2.4.1"},"gitHead":"f8758994247cb636b36140792b572ecb2e9f76be","_id":"jwt-async@1.1.1","_shasum":"71cf76ed81d54eefc86e0629710e8a2d51dbce0e","_from":".","_npmVersion":"2.6.1","_nodeVersion":"1.4.3","_npmUser":{"name":"patbaker82","email":"patricksbaker@gmail.com"},"maintainers":[{"name":"patbaker82","email":"patricksbaker@gmail.com"}],"dist":{"shasum":"71cf76ed81d54eefc86e0629710e8a2d51dbce0e","tarball":"https://registry.npmjs.org/jwt-async/-/jwt-async-1.1.1.tgz","integrity":"sha512-5dZFVDQvcfR9WRHOxW4WWouoOVaPOh4IzOc7P0D1ePD3bv38NQy16vZAZZbTsRKxn7lSYH7vAS+pyjJpBAAPIQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFaHWZI9fpw+sYfFt9o5aML6uOVV7PpngHj/aOwh6OCIAiA69r5RYwKL6WnOz0/HyEjGf7tTKdUy+wti1scLuMWCEw=="}]}},"1.1.2":{"name":"jwt-async","version":"1.1.2","description":"JSON Web Token (JWT) with asynchronicity","main":"index.js","scripts":{"test":"make keys;./node_modules/.bin/mocha"},"repository":{"type":"git","url":"https://github.com/patbaker82/node-jwt-async"},"keywords":["jwt","async","claims","validations","encode","decode","verify"],"author":{"name":"Patrick Baker","email":"patricksbaker@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/patbaker82/node-jwt-async/issues"},"homepage":"https://github.com/patbaker82/node-jwt-async","devDependencies":{"chai":"^1.10.0","mocha":"^2.0.1","sinon":"^1.12.2","sinon-chai":"^2.6.0"},"engine":"node >= 0.10.0","dependencies":{"lodash":"^2.4.1"},"gitHead":"aecffa22b33ffcada864b580d163ff72348200ac","_id":"jwt-async@1.1.2","_shasum":"58f7c7c9252b907024ac4d7b18c8bd27740f338d","_from":".","_npmVersion":"2.6.1","_nodeVersion":"1.4.3","_npmUser":{"name":"patbaker82","email":"patricksbaker@gmail.com"},"maintainers":[{"name":"patbaker82","email":"patricksbaker@gmail.com"}],"dist":{"shasum":"58f7c7c9252b907024ac4d7b18c8bd27740f338d","tarball":"https://registry.npmjs.org/jwt-async/-/jwt-async-1.1.2.tgz","integrity":"sha512-m4TN013obqY8UfxveaEVCIQv7xOyeti7CG8HN5/YPXaO3FfQOXRWLJ7W7bILoNCHN0B+qYhp7BQsRUovMWTTCw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHbz3lQc11o0Iu6pZ5OP0Oyuv/wIgUi57sg6B0Uw9skLAiAJZ9nF3G1F0AfoedPTiUsPSlUmsch5k86xaedEnPGWDw=="}]}}},"homepage":"https://github.com/patbaker82/node-jwt-async","keywords":["jwt","async","claims","validations","encode","decode","verify"],"repository":{"type":"git","url":"https://github.com/patbaker82/node-jwt-async"},"author":{"name":"Patrick Baker","email":"patricksbaker@gmail.com"},"bugs":{"url":"https://github.com/patbaker82/node-jwt-async/issues"},"license":"MIT","readmeFilename":"README.MD","users":{"mhaidarh":true,"ngpvnk":true}}