正在显示
4 个修改的文件
包含
236 行增加
和
2 行删除
.vscode/launch.json
0 → 100644
1 | +{ | ||
2 | + // Use IntelliSense to learn about possible Node.js debug attributes. | ||
3 | + // Hover to view descriptions of existing attributes. | ||
4 | + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 | ||
5 | + "version": "0.2.0", | ||
6 | + "configurations": [ | ||
7 | + { | ||
8 | + "type": "node", | ||
9 | + "request": "launch", | ||
10 | + "name": "Launch Program", | ||
11 | + "program": "${workspaceRoot}/bin/www" | ||
12 | + } | ||
13 | + ] | ||
14 | +} |
1 | const router = require('koa-router')() | 1 | const router = require('koa-router')() |
2 | var userContoller = require('../controller/userController') | 2 | var userContoller = require('../controller/userController') |
3 | var status = require('../util/resTemplate') | 3 | var status = require('../util/resTemplate') |
4 | +const inspectMediaChannelKey = require('../util/inspectMediaChannelKey') | ||
5 | + | ||
4 | 6 | ||
5 | router.prefix('/users') | 7 | router.prefix('/users') |
6 | 8 | ||
@@ -106,7 +108,21 @@ router.put('/updatePwByTelphone',async(ctx, next)=>{ | @@ -106,7 +108,21 @@ router.put('/updatePwByTelphone',async(ctx, next)=>{ | ||
106 | }) | 108 | }) |
107 | 109 | ||
108 | 110 | ||
109 | - | 111 | +/** |
112 | + * 加密token | ||
113 | + */ | ||
114 | +router.post('/encryptionToken',async (ctx, next) => { | ||
115 | + try{ | ||
116 | + let body = ctx.request.body; | ||
117 | + | ||
118 | + let inspectMediaChannel = await inspectMediaChannelKey(body.appID,body.appCertificate,body.channel,body.uid) | ||
119 | + ctx.response.status= 200; | ||
120 | + ctx.response.body= inspectMediaChannel | ||
121 | + }catch(e){ | ||
122 | + console.log(e) | ||
123 | + status.catchError(ctx,400,e.message); | ||
124 | + } | ||
125 | +}) | ||
110 | 126 | ||
111 | 127 | ||
112 | module.exports = router | 128 | module.exports = router |
util/inspectMediaChannelKey.js
0 → 100644
1 | +var crypto = require('crypto'); | ||
2 | + | ||
3 | +var appID = "970ca35de60c44645bbae8a215061b33";//传参 | ||
4 | +var appCertificate = "5cfd2fd1755d40ecb72977518be15d3b";//传参 | ||
5 | +var channel = "7d72365eb983485397e3e3f9d460bdda"; //传参 | ||
6 | +var ts = 1446455472; | ||
7 | +var r = 58964981; | ||
8 | +var uid=2882341273; //传参 | ||
9 | +var expiredTs=1446455471; | ||
10 | + | ||
11 | +var version = "005"; | ||
12 | +var noUpload = "0"; | ||
13 | +var audioVideoUpload = "3"; | ||
14 | + | ||
15 | +var encodeHMac = function(key, message) { | ||
16 | + return crypto.createHmac('sha1', key).update(message).digest('hex').toUpperCase(); | ||
17 | +}; | ||
18 | + | ||
19 | +var hexDecode = function(str) { | ||
20 | + return new Buffer(str, 'hex'); | ||
21 | +}; | ||
22 | + | ||
23 | + | ||
24 | + | ||
25 | + | ||
26 | + | ||
27 | +var Message = function(options) { | ||
28 | + options.pack = function() { | ||
29 | + var out = ByteBuf(); | ||
30 | + return out.putUint16(options.serviceType) | ||
31 | + .putBytes(options.appID) | ||
32 | + .putUint32(options.unixTs) | ||
33 | + .putUint32(options.salt) | ||
34 | + .putString(options.channelName) | ||
35 | + .putUint32(options.uid) | ||
36 | + .putUint32(options.expiredTs) | ||
37 | + .putTreeMap(options.extra) | ||
38 | + .pack(); | ||
39 | + } | ||
40 | + | ||
41 | + return options; | ||
42 | +} | ||
43 | + | ||
44 | +// InChannelPermissionKey | ||
45 | +var ALLOW_UPLOAD_IN_CHANNEL = 1; | ||
46 | + | ||
47 | +// Service Type | ||
48 | +var MEDIA_CHANNEL_SERVICE = 1; | ||
49 | +var RECORDING_SERVICE = 2; | ||
50 | +var PUBLIC_SHARING_SERVICE = 3; | ||
51 | +var IN_CHANNEL_PERMISSION = 4; | ||
52 | + | ||
53 | +var inspectMediaChannelKey = function async(appID, appCertificate, channelName, unixTs, randomInt, uid, expiredTs) { | ||
54 | + var rawAppID = hexDecode(appID); | ||
55 | + console.log('App ID:\t\t\t ' + rawAppID.toString('hex').toUpperCase()); | ||
56 | + | ||
57 | + var rawAppCertificate = hexDecode(appCertificate); | ||
58 | + console.log('App Certificate:\t ' + rawAppCertificate.toString('hex').toUpperCase()); | ||
59 | + | ||
60 | + var serviceType = MEDIA_CHANNEL_SERVICE; | ||
61 | + var extra = null; | ||
62 | + var ByteBuf = function() { | ||
63 | + var that = { | ||
64 | + buffer: new Buffer(1024) | ||
65 | + , position: 0 | ||
66 | + }; | ||
67 | + | ||
68 | + that.buffer.fill(0); | ||
69 | + | ||
70 | + that.pack = function() { | ||
71 | + var out = new Buffer(that.position); | ||
72 | + that.buffer.copy(out, 0, 0, out.length); | ||
73 | + return out; | ||
74 | + }; | ||
75 | + | ||
76 | + that.putUint16 = function(v) { | ||
77 | + try { | ||
78 | + console.log(typeof v) | ||
79 | + that.buffer.writeUInt16LE(v, that.position); | ||
80 | + that.position += 2; | ||
81 | + } catch (error) { | ||
82 | + console.log('buffer',error) | ||
83 | + } | ||
84 | + | ||
85 | + return that; | ||
86 | + }; | ||
87 | + | ||
88 | + that.putUint32 = function(v) { | ||
89 | + that.buffer.writeUInt32LE(v, that.position); | ||
90 | + that.position += 4; | ||
91 | + return that; | ||
92 | + }; | ||
93 | + | ||
94 | + that.putBytes = function(bytes) { | ||
95 | + that.putUint16(bytes.length); | ||
96 | + bytes.copy(that.buffer, that.position); | ||
97 | + that.position += bytes.length; | ||
98 | + return that; | ||
99 | + }; | ||
100 | + | ||
101 | + that.putString = function(str) { | ||
102 | + return that.putBytes(new Buffer(str)); | ||
103 | + }; | ||
104 | + | ||
105 | + that.putTreeMap = function(map) { | ||
106 | + if (!map) { | ||
107 | + that.putUint16(0); | ||
108 | + return that; | ||
109 | + } | ||
110 | + | ||
111 | + that.putUint16(Object.keys(map).length); | ||
112 | + for (var key in map) { | ||
113 | + that.putUint16(key); | ||
114 | + that.putString(map[key]); | ||
115 | + } | ||
116 | + | ||
117 | + return that; | ||
118 | + }; | ||
119 | + | ||
120 | + return that; | ||
121 | + } | ||
122 | + var Message = function(options) { | ||
123 | + console.log('s生成buffer') | ||
124 | + | ||
125 | + options.pack = function() { | ||
126 | + var out = ByteBuf(); | ||
127 | + return out.putUint16(options.serviceType) | ||
128 | + .putBytes(options.appID) | ||
129 | + .putUint32(options.unixTs) | ||
130 | + .putUint32(options.salt) | ||
131 | + .putString(options.channelName) | ||
132 | + .putUint32(options.uid) | ||
133 | + .putUint32(options.expiredTs) | ||
134 | + .putTreeMap(options.extra) | ||
135 | + .pack(); | ||
136 | + } | ||
137 | + | ||
138 | + return options; | ||
139 | + } | ||
140 | + | ||
141 | + var m = Message({ | ||
142 | + serviceType: serviceType | ||
143 | + , appID: rawAppID | ||
144 | + , unixTs: unixTs | ||
145 | + , salt: randomInt | ||
146 | + , channelName: channelName | ||
147 | + , uid: uid | ||
148 | + , expiredTs: expiredTs | ||
149 | + , extra: extra | ||
150 | + }); | ||
151 | + | ||
152 | + var toSign = m.pack(); | ||
153 | + console.log("Message to sign:\t " + toSign.toString('hex').toUpperCase()); | ||
154 | + | ||
155 | + var signature = encodeHMac(rawAppCertificate, toSign); | ||
156 | + console.log("Signature:\t\t " + signature.toString('hex').toUpperCase()); | ||
157 | + var DynamicKey5Content = function(options) { | ||
158 | + options.pack = function() { | ||
159 | + var out = ByteBuf(); | ||
160 | + return out.putUint16(options.serviceType) | ||
161 | + .putString(options.signature) | ||
162 | + .putBytes(options.appID) | ||
163 | + .putUint32(options.unixTs) | ||
164 | + .putUint32(options.salt) | ||
165 | + .putUint32(options.expiredTs) | ||
166 | + .putTreeMap(options.extra) | ||
167 | + .pack(); | ||
168 | + } | ||
169 | + | ||
170 | + return options; | ||
171 | + } | ||
172 | + var content = DynamicKey5Content({ | ||
173 | + serviceType: serviceType | ||
174 | + , signature: signature | ||
175 | + , appID: hexDecode(appID) | ||
176 | + , unixTs: unixTs | ||
177 | + , salt: randomInt | ||
178 | + , expiredTs: expiredTs | ||
179 | + , extra: extra}).pack(); | ||
180 | + console.log("Content to encode:\t " + content.toString('hex').toUpperCase()); | ||
181 | + | ||
182 | + var channelKey = version + content.toString('base64'); | ||
183 | + console.log("Channel key:\t\t " + channelKey); | ||
184 | + return channelKey; | ||
185 | +}; | ||
186 | + | ||
187 | +var expected = "005AQAoAEJERTJDRDdFNkZDNkU0ODYxNkYxQTYwOUVFNTM1M0U5ODNCQjFDNDQQAJcMo13mDERkW7roohUGGzOwKDdW9buDA68oN1YAAA=="; | ||
188 | +//var result = inspectMediaChannelKey(appID, appCertificate, channel, ts, r, uid, expiredTs); | ||
189 | +//console.log( (expected == result) ? "ok" : "failed"); | ||
190 | +module.exports = async(appIDa, appCertificatea, channela,uida)=>{ | ||
191 | + let keys = await inspectMediaChannelKey(appIDa, appCertificatea, channela, ts, r, uida, expiredTs); | ||
192 | + if(expected == keys){ | ||
193 | + return { | ||
194 | + code:200, | ||
195 | + channelKey:keys, | ||
196 | + uid:uida | ||
197 | + } | ||
198 | + }else { | ||
199 | + return { | ||
200 | + code:400, | ||
201 | + msg:"failed" | ||
202 | + } | ||
203 | + } | ||
204 | +} |
-
请 注册 或 登录 后发表评论