Add host/digest to HTTP signature
This commit is contained in:
		
							parent
							
								
									f802fe57b9
								
							
						
					
					
						commit
						dddf7834cc
					
				
					 1 changed files with 12 additions and 3 deletions
				
			
		| 
						 | 
					@ -2,6 +2,7 @@ import { request } from 'https';
 | 
				
			||||||
const { sign } = require('http-signature');
 | 
					const { sign } = require('http-signature');
 | 
				
			||||||
import { URL } from 'url';
 | 
					import { URL } from 'url';
 | 
				
			||||||
import * as debug from 'debug';
 | 
					import * as debug from 'debug';
 | 
				
			||||||
 | 
					const crypto = require('crypto');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import config from '../../config';
 | 
					import config from '../../config';
 | 
				
			||||||
import { ILocalUser } from '../../models/user';
 | 
					import { ILocalUser } from '../../models/user';
 | 
				
			||||||
| 
						 | 
					@ -13,6 +14,12 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const { protocol, hostname, port, pathname, search } = new URL(url);
 | 
						const { protocol, hostname, port, pathname, search } = new URL(url);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const data = JSON.stringify(object);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const sha256 = crypto.createHash('sha256');
 | 
				
			||||||
 | 
						sha256.update(data);
 | 
				
			||||||
 | 
						const hash = sha256.digest('base64');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const req = request({
 | 
						const req = request({
 | 
				
			||||||
		protocol,
 | 
							protocol,
 | 
				
			||||||
		hostname,
 | 
							hostname,
 | 
				
			||||||
| 
						 | 
					@ -20,7 +27,8 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso
 | 
				
			||||||
		method: 'POST',
 | 
							method: 'POST',
 | 
				
			||||||
		path: pathname + search,
 | 
							path: pathname + search,
 | 
				
			||||||
		headers: {
 | 
							headers: {
 | 
				
			||||||
			'Content-Type': 'application/activity+json'
 | 
								'Content-Type': 'application/activity+json',
 | 
				
			||||||
 | 
								'Digest': `SHA-256=${hash}`
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}, res => {
 | 
						}, res => {
 | 
				
			||||||
		log(`${url} --> ${res.statusCode}`);
 | 
							log(`${url} --> ${res.statusCode}`);
 | 
				
			||||||
| 
						 | 
					@ -35,7 +43,8 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso
 | 
				
			||||||
	sign(req, {
 | 
						sign(req, {
 | 
				
			||||||
		authorizationHeaderName: 'Signature',
 | 
							authorizationHeaderName: 'Signature',
 | 
				
			||||||
		key: user.keypair,
 | 
							key: user.keypair,
 | 
				
			||||||
		keyId: `${config.url}/users/${user._id}/publickey`
 | 
							keyId: `${config.url}/users/${user._id}/publickey`,
 | 
				
			||||||
 | 
							headers: ['date', 'host', 'digest']
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Signature: Signature ... => Signature: ...
 | 
						// Signature: Signature ... => Signature: ...
 | 
				
			||||||
| 
						 | 
					@ -43,5 +52,5 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso
 | 
				
			||||||
	sig = sig.replace(/^Signature /, '');
 | 
						sig = sig.replace(/^Signature /, '');
 | 
				
			||||||
	req.setHeader('Signature', sig);
 | 
						req.setHeader('Signature', sig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	req.end(JSON.stringify(object));
 | 
						req.end(data);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue