You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							233 lines
						
					
					
						
							6.9 KiB
						
					
					
				
			
		
		
	
	
							233 lines
						
					
					
						
							6.9 KiB
						
					
					
				| # jsonwebtoken [](http://travis-ci.org/auth0/node-jsonwebtoken)
 | |
| 
 | |
| 
 | |
| An implementation of [JSON Web Tokens](https://tools.ietf.org/html/rfc7519).
 | |
| 
 | |
| This was developed against `draft-ietf-oauth-json-web-token-08`. It makes use of [node-jws](https://github.com/brianloveswords/node-jws)
 | |
| 
 | |
| # Install
 | |
| 
 | |
| ```bash
 | |
| $ npm install jsonwebtoken
 | |
| ```
 | |
| 
 | |
| # Usage
 | |
| 
 | |
| ### jwt.sign(payload, secretOrPrivateKey, options)
 | |
| 
 | |
| (Synchronous) Returns the JsonWebToken as string
 | |
| 
 | |
| `payload` could be an object literal, buffer or string. *Please note that* `exp` is only set if the payload is an object literal.
 | |
| 
 | |
| `secretOrPrivateKey` is a string or buffer containing either the secret for HMAC algorithms, or the PEM
 | |
| encoded private key for RSA and ECDSA.
 | |
| 
 | |
| `options`:
 | |
| 
 | |
| * `algorithm` (default: `HS256`)
 | |
| * `expiresIn`: expressed in seconds or an string describing a time span [rauchg/ms](https://github.com/rauchg/ms.js). Eg: `60`, `"2 days"`, `"10h"`, `"7d"`
 | |
| * `audience`
 | |
| * `subject`
 | |
| * `issuer`
 | |
| * `noTimestamp`
 | |
| * `headers`
 | |
| 
 | |
| If `payload` is not a buffer or a string, it will be coerced into a string
 | |
| using `JSON.stringify`.
 | |
| 
 | |
| If any `expiresIn`, `audience`, `subject`, `issuer` are not provided, there is no default. The jwt generated won't include those properties in the payload.
 | |
| 
 | |
| Additional headers can be provided via the `headers` object.
 | |
| 
 | |
| Generated jwts will include an `iat` claim by default unless `noTimestamp` is specified.
 | |
| 
 | |
| Example
 | |
| 
 | |
| ```js
 | |
| // sign with default (HMAC SHA256)
 | |
| var jwt = require('jsonwebtoken');
 | |
| var token = jwt.sign({ foo: 'bar' }, 'shhhhh');
 | |
| 
 | |
| // sign with RSA SHA256
 | |
| var cert = fs.readFileSync('private.key');  // get private key
 | |
| var token = jwt.sign({ foo: 'bar' }, cert, { algorithm: 'RS256'});
 | |
| ```
 | |
| 
 | |
| ### jwt.verify(token, secretOrPublicKey, [options, callback])
 | |
| 
 | |
| (Asynchronous) If a callback is supplied, function acts asynchronously. Callback passed the payload decoded if the signature (and optionally expiration, audience, issuer) are valid. If not, it will be passed the error.
 | |
| 
 | |
| (Synchronous) If a callback is not supplied, function acts synchronously. Returns the payload decoded if the signature (and optionally expiration, audience, issuer) are valid. If not, it will throw the error.
 | |
| 
 | |
| `token` is the JsonWebToken string
 | |
| 
 | |
| `secretOrPublicKey` is a string or buffer containing either the secret for HMAC algorithms, or the PEM
 | |
| encoded public key for RSA and ECDSA.
 | |
| 
 | |
| `options`
 | |
| 
 | |
| * `algorithms`: List of strings with the names of the allowed algorithms. For instance, `["HS256", "HS384"]`.
 | |
| * `audience`: if you want to check audience (`aud`), provide a value here
 | |
| * `issuer`: if you want to check issuer (`iss`), provide a value here
 | |
| * `ignoreExpiration`: if `true` do not validate the expiration of the token.
 | |
| * `maxAge`: optional sets an expiration based on the `iat` field. Eg `2h`
 | |
| 
 | |
| ```js
 | |
| // verify a token symmetric - synchronous
 | |
| var decoded = jwt.verify(token, 'shhhhh');
 | |
| console.log(decoded.foo) // bar
 | |
| 
 | |
| // verify a token symmetric
 | |
| jwt.verify(token, 'shhhhh', function(err, decoded) {
 | |
|   console.log(decoded.foo) // bar
 | |
| });
 | |
| 
 | |
| // invalid token - synchronous
 | |
| try {
 | |
|   var decoded = jwt.verify(token, 'wrong-secret');
 | |
| } catch(err) {
 | |
|   // err
 | |
| }
 | |
| 
 | |
| // invalid token
 | |
| jwt.verify(token, 'wrong-secret', function(err, decoded) {
 | |
|   // err
 | |
|   // decoded undefined
 | |
| });
 | |
| 
 | |
| // verify a token asymmetric
 | |
| var cert = fs.readFileSync('public.pem');  // get public key
 | |
| jwt.verify(token, cert, function(err, decoded) {
 | |
|   console.log(decoded.foo) // bar
 | |
| });
 | |
| 
 | |
| // verify audience
 | |
| var cert = fs.readFileSync('public.pem');  // get public key
 | |
| jwt.verify(token, cert, { audience: 'urn:foo' }, function(err, decoded) {
 | |
|   // if audience mismatch, err == invalid audience
 | |
| });
 | |
| 
 | |
| // verify issuer
 | |
| var cert = fs.readFileSync('public.pem');  // get public key
 | |
| jwt.verify(token, cert, { audience: 'urn:foo', issuer: 'urn:issuer' }, function(err, decoded) {
 | |
|   // if issuer mismatch, err == invalid issuer
 | |
| });
 | |
| 
 | |
| // alg mismatch
 | |
| var cert = fs.readFileSync('public.pem'); // get public key
 | |
| jwt.verify(token, cert, { algorithms: ['RS256'] }, function (err, payload) {
 | |
|   // if token alg != RS256,  err == invalid signature
 | |
| });
 | |
| 
 | |
| ```
 | |
| 
 | |
| ### jwt.decode(token [, options])
 | |
| 
 | |
| (Synchronous) Returns the decoded payload without verifying if the signature is valid.
 | |
| 
 | |
| __Warning:__ This will __not__ verify whether the signature is valid. You should __not__ use this for untrusted messages. You most likely want to use `jwt.verify` instead.
 | |
| 
 | |
| `token` is the JsonWebToken string
 | |
| 
 | |
| `options`:
 | |
| 
 | |
| * `json`: force JSON.parse on the payload even if the header doesn't contain `"typ":"JWT"`.
 | |
| * `complete`: return an object with the decoded payload and header.
 | |
| 
 | |
| Example
 | |
| 
 | |
| ```js
 | |
| // get the decoded payload ignoring signature, no secretOrPrivateKey needed
 | |
| var decoded = jwt.decode(token);
 | |
| 
 | |
| // get the decoded payload and header
 | |
| var decoded = jwt.decode(token, {complete: true});
 | |
| console.log(decoded.header);
 | |
| console.log(decoded.payload)
 | |
| ```
 | |
| 
 | |
| ## Errors & Codes
 | |
| Possible thrown errors during verification.
 | |
| Error is the first argument of the verification callback.
 | |
| 
 | |
| ### TokenExpiredError
 | |
| 
 | |
| Thrown error if the token is expired.
 | |
| 
 | |
| Error object:
 | |
| 
 | |
| * name: 'TokenExpiredError'
 | |
| * message: 'jwt expired'
 | |
| * expiredAt: [ExpDate]
 | |
| 
 | |
| ```js
 | |
| jwt.verify(token, 'shhhhh', function(err, decoded) {
 | |
|   if (err) {
 | |
|     /*
 | |
|       err = {
 | |
|         name: 'TokenExpiredError',
 | |
|         message: 'jwt expired',
 | |
|         expiredAt: 1408621000
 | |
|       }
 | |
|     */
 | |
|   }
 | |
| });
 | |
| ```
 | |
| 
 | |
| ### JsonWebTokenError
 | |
| Error object:
 | |
| 
 | |
| * name: 'JsonWebTokenError'
 | |
| * message:
 | |
|   * 'jwt malformed'
 | |
|   * 'jwt signature is required'
 | |
|   * 'invalid signature'
 | |
|   * 'jwt audience invalid. expected: [OPTIONS AUDIENCE]'
 | |
|   * 'jwt issuer invalid. expected: [OPTIONS ISSUER]'
 | |
| 
 | |
| ```js
 | |
| jwt.verify(token, 'shhhhh', function(err, decoded) {
 | |
|   if (err) {
 | |
|     /*
 | |
|       err = {
 | |
|         name: 'JsonWebTokenError',
 | |
|         message: 'jwt malformed'
 | |
|       }
 | |
|     */
 | |
|   }
 | |
| });
 | |
| ```
 | |
| 
 | |
| ## Algorithms supported
 | |
| 
 | |
| Array of supported algorithms. The following algorithms are currently supported.
 | |
| 
 | |
| alg Parameter Value | Digital Signature or MAC Algorithm
 | |
| ----------------|----------------------------
 | |
| HS256 | HMAC using SHA-256 hash algorithm
 | |
| HS384 | HMAC using SHA-384 hash algorithm
 | |
| HS512 | HMAC using SHA-512 hash algorithm
 | |
| RS256 | RSASSA using SHA-256 hash algorithm
 | |
| RS384 | RSASSA using SHA-384 hash algorithm
 | |
| RS512 | RSASSA using SHA-512 hash algorithm
 | |
| ES256 | ECDSA using P-256 curve and SHA-256 hash algorithm
 | |
| ES384 | ECDSA using P-384 curve and SHA-384 hash algorithm
 | |
| ES512 | ECDSA using P-521 curve and SHA-512 hash algorithm
 | |
| none | No digital signature or MAC value included
 | |
| 
 | |
| ## Issue Reporting
 | |
| 
 | |
| If you have found a bug or if you have a feature request, please report them at this repository issues section. Please do not report security vulnerabilities on the public GitHub issue tracker. The [Responsible Disclosure Program](https://auth0.com/whitehat) details the procedure for disclosing security issues.
 | |
| 
 | |
| # TODO
 | |
| 
 | |
| * X.509 certificate chain is not checked
 | |
| 
 | |
| ## Author
 | |
| 
 | |
| [Auth0](https://auth0.com)
 | |
| 
 | |
| ## License
 | |
| 
 | |
| This project is licensed under the MIT license. See the [LICENSE](LICENSE) file for more info.
 |