44 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var crypto = require('crypto');
 | |
| var JWT = module.exports;
 | |
| 
 | |
| JWT.decode = function (jwt) {
 | |
|   var parts;
 | |
| 
 | |
|   try {
 | |
|     parts = jwt.split('.');
 | |
|     return {
 | |
|       header: JSON.parse(Buffer.from(parts[0], 'base64'))
 | |
|     , payload: JSON.parse(Buffer.from(parts[1], 'base64'))
 | |
|     , signature: parts[2] //Buffer.from(parts[2], 'base64')
 | |
|     };
 | |
|   } catch(e) {
 | |
|     throw new Error("JWT Parse Error: could not split, base64 decode, and JSON.parse token " + jwt);
 | |
|   }
 | |
| };
 | |
| 
 | |
| JWT.verify = function (jwt) {
 | |
|   var decoded = JWT.decode(jwt);
 | |
|   throw new Error("not implemented yet");
 | |
| };
 | |
| 
 | |
| function base64ToUrlSafe(str) {
 | |
|   return str
 | |
|     .replace(/\+/g, '-')
 | |
|     .replace(/\//g, '_')
 | |
|     .replace(/=/g, '')
 | |
|   ;
 | |
| }
 | |
| 
 | |
| JWT.sign = function (claims, key) {
 | |
|   if (!claims.iat && false !== claims.iat) {
 | |
|     claims.iat = Math.round(Date.now()/1000);
 | |
|   }
 | |
|   var thumb = base64ToUrlSafe(crypto.createHash('sha256').update(key).digest('base64'));
 | |
|   var protect = base64ToUrlSafe(Buffer.from(JSON.stringify({ alg: 'HS256', typ: 'JWT', kid: thumb })).toString('base64'));
 | |
|   var payload = base64ToUrlSafe(Buffer.from(JSON.stringify(claims)).toString('base64'));
 | |
|   var signature = base64ToUrlSafe(crypto.createHmac('sha256', key).update(protect + '.' + payload).digest('base64'));
 | |
|   return protect + '.' + payload + '.' + signature;
 | |
| };
 |