-
Notifications
You must be signed in to change notification settings - Fork 3
/
Signature.js
32 lines (29 loc) · 1.08 KB
/
Signature.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
* @Author: zyc
* @Date: 2016-01-20 11:50:39
* @Last Modified by: zyc
* @Last Modified time: 2016-01-21 15:32:29
*/
'use strict'
const assert = require('assert')
const crypto = require('crypto')
module.exports = class {
constructor (AccessKeySecret, XMnsVersion) {
this.AccessKeySecret = AccessKeySecret
this.XMnsVersion = XMnsVersion
}
sign (options) {
const { VERB, CanonicalizedResource } = options
assert.ok(VERB, 'VERB required')
assert.ok(CanonicalizedResource, 'CanonicalizedResource required')
let { CONTENT_MD5, CONTENT_TYPE, CanonicalizedMNSHeaders } = options
CONTENT_MD5 = CONTENT_MD5 || ''
CONTENT_TYPE = CONTENT_TYPE || ''
const DATE = new Date().toGMTString()
CanonicalizedMNSHeaders = CanonicalizedMNSHeaders || 'x-mns-version:' + this.XMnsVersion
const signature = `${VERB}\n${CONTENT_MD5}\n${CONTENT_TYPE}\n${DATE}\n${CanonicalizedMNSHeaders}\n${CanonicalizedResource}`
const hmac = crypto.createHmac('sha1', this.AccessKeySecret)
hmac.update(signature)
return { DATE, Signature: hmac.digest().toString('base64') }
}
}