阿里oss服务端签名直传并设置上传回调_node版

阿里oss服务端签名直传并设置上传回调_node版 存储服务 阿里oss服务端签名直传并设置上传回调_node版
文章图片
image.png 【阿里oss服务端签名直传并设置上传回调_node版】阿里没有官方示例,这里用node已经成功实现上传和回调校验的问题
上传接口 最终吧result返回出去就可以了

// 处理policy 数据 let end = new Date().getTime() + 360000; let expiration = new Date(end).toISOString(); let policyString = { expiration, conditions: [ { bucket: `${bucket}` }, // 指定bucket ['content-length-range', 0, 1048576000], // 自定义文件大小 ['starts-with', '$key', dir] // 自定义文件路径 ] }; policyString = JSON.stringify(policyString); const base64Policy = Buffer.from(policyString).toString('base64'); // 处理callback数据 let callbackString = { callbackUrl: encodeURI(callbackUrl), // 回调地址 callbackBody: 'bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}&format=${imageInfo.format}', callbackBodyType: 'application/x-www-form-urlencoded' }; let base64CallbackBody = Buffer.from(JSON.stringify(callbackString)).toString('base64'); const signature = Crypto.createHmac('sha1', accessKeySecret) .update(base64Policy) .digest('base64'); let result = { accessid: accessKeyId, host, policy: base64Policy, signature, expire: end, callback: base64CallbackBody, dir };

回调处理
  1. 普通回调如果不校验参数可以直接返回200,或者自行添加需要的逻辑
    我们这里因为为了符合阿里示例的回调校验,弄了好久,可能还是技术有问题,最后是通过引用别人写的包才处理成功(这一步是非必要的,阿里自己写标注了可选)回调
  2. 这里我们主要引用的包就是帮我们做解密校验的
    npm i jsrsasign
  3. 拼接字符串那一块如果有不同的可以查看上面回调的阿里文档
// 1.获取oss签名的header和公钥 let authorizationBase64 = ''; let pubKeyUrlBase64 = ''; console.log(params); console.log(ctx.header); if (ctx.header && ctx.header.authorization) { authorizationBase64 = ctx.header.authorization; } if (ctx.header && ctx.header['x-oss-pub-key-url']) { pubKeyUrlBase64 = ctx.header['x-oss-pub-key-url']; }if (!authorizationBase64 || !pubKeyUrlBase64) { return ctx.success({ status: 1, msg: '未校验' }); }// 2.获取公钥 let pubKeyUrl = Buffer.from(pubKeyUrlBase64, 'base64').toString('utf-8'); const pubKey = await ctx.helper.httpRequest({ url: pubKeyUrl, method: 'GET', params }); if (!pubKey) { return ctx.success({ status: 1, msg: 'obtain' }); }// 3.拼接签名 let path = '/public/ossCallback'; let authStr = `${path}\n${querystring.stringify(params)}`; // 4.校验签名 let aa = this.RSA_VERIFY_SIGN(pubKey, authStr, authorizationBase64); // 校验方法 RSA_VERIFY_SIGN(publicKey, src, data) { const signature = new rs.KJUR.crypto.Signature({ alg: 'MD5withRSA', prvkeypem: publicKey }); signature.updateString(src); // 传入待签明文 return signature.verify(Buffer.from(data, 'base64').toString('hex')); }

总结 至此我们就完成了上传和回调校验的工作
前端的代码就不展示了,调用方法取结果并调用返回的url上传文件
反正我前端也很渣

    推荐阅读