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

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

存储服务

阿里oss服务端签名直传并设置上传回调_node版_第1张图片
image.png

阿里没有官方示例,这里用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上传文件
反正我前端也很渣

你可能感兴趣的:(阿里oss服务端签名直传并设置上传回调_node版)