Skip to content

Commit 53dd3c3

Browse files
committed
Merge pull request #89 from jaredhanson/decode-complete
Add option to return header and payload when decoding.
2 parents 881d07f + ba3174d commit 53dd3c3

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

Diff for: README.md

+6
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,18 @@ jwt.verify(token, cert, { algorithms: ['RS256'] }, function (err, payload) {
137137
`options`:
138138

139139
* `json`: force JSON.parse on the payload even if the header doesn't contain `"typ":"JWT"`.
140+
* `complete`: return an object with the decode payload and header.
140141

141142
Example
142143

143144
```js
144145
// get the decoded payload ignoring signature, no secretOrPrivateKey needed
145146
var decoded = jwt.decode(token);
147+
148+
// get the decoded payload and header
149+
var decoded = jwt.decode(token, {complete: true});
150+
console.log(decoded.header);
151+
console.log(decoded.payload)
146152
```
147153

148154
## Errors & Codes

Diff for: index.js

+15-3
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,31 @@ var JsonWebTokenError = module.exports.JsonWebTokenError = require('./lib/JsonWe
44
var TokenExpiredError = module.exports.TokenExpiredError = require('./lib/TokenExpiredError');
55

66
module.exports.decode = function (jwt, options) {
7+
options = options || {};
78
var decoded = jws.decode(jwt, options);
8-
var payload = decoded && decoded.payload;
9+
if (!decoded) { return null; }
10+
var payload = decoded.payload;
911

1012
//try parse the payload
1113
if(typeof payload === 'string') {
1214
try {
1315
var obj = JSON.parse(payload);
1416
if(typeof obj === 'object') {
15-
return obj;
17+
payload = obj;
1618
}
1719
} catch (e) { }
1820
}
19-
21+
22+
//return header if `complete` option is enabled. header includes claims
23+
//such as `kid` and `alg` used to select the key within a JWKS needed to
24+
//verify the signature
25+
if (options.complete === true) {
26+
return {
27+
header: decoded.header,
28+
payload: payload,
29+
signature: decoded.signature
30+
}
31+
}
2032
return payload;
2133
};
2234

Diff for: test/jwt.rs.tests.js

+9
Original file line numberDiff line numberDiff line change
@@ -275,5 +275,14 @@ describe('RS256', function() {
275275
assert.deepEqual(payload, obj);
276276
done();
277277
});
278+
it('should return the header and payload and signature if complete option is set', function(done) {
279+
var obj = { foo: 'bar' };
280+
var token = jwt.sign(obj, priv, { algorithm: 'RS256' });
281+
var decoded = jwt.decode(token, { complete: true });
282+
assert.deepEqual(decoded.payload, obj);
283+
assert.deepEqual(decoded.header, { typ: 'JWT', alg: 'RS256' });
284+
assert.ok(typeof decoded.signature == 'string');
285+
done();
286+
});
278287
});
279288
});

0 commit comments

Comments
 (0)