阿里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
};
回调处理
- 普通回调如果不校验参数可以直接返回200,或者自行添加需要的逻辑
我们这里因为为了符合阿里示例的回调校验,弄了好久,可能还是技术有问题,最后是通过引用别人写的包才处理成功(这一步是非必要的,阿里自己写标注了可选)回调
- 这里我们主要引用的包就是帮我们做解密校验的
npm i jsrsasign
- 拼接字符串那一块如果有不同的可以查看上面回调的阿里文档
// 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上传文件
反正我前端也很渣
推荐阅读
- 社保代缴公司服务费包含哪些
- 私有化轻量级持续集成部署方案--03-部署web服务(下)
- 探索免费开源服务器tomcat的魅力
- [源码解析]|[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)
- Dubbo引用服务
- 第六章|第六章 Sleuth--链路追踪
- 云原生微服务技术趋势解读
- CentOS7 阿里云镜像配置方法
- 如何在阿里云linux上部署java项目
- mac|mac 链接linux服务器 如何在Mac上连接服务器