OBS华为云对象存储 签名计算
OBS提供的SDK已集成了签名计算,建议您使用SDK进行开发。但是在没有提供对应SDK的场景下(小程序),这时候就要自行计算。以Header中携带签名为例,计算得到签名(Header中携带签名、URL中携带签名。基于浏览器上传的表单中携带签名。OBS根据应用场景,提供了。)后,返回签名头域(
·
OBS根据应用场景,提供了Header中携带签名、URL中携带签名和基于浏览器上传的表单中携带签名3种签名计算方式。
OBS提供的SDK已集成了签名计算,建议您使用SDK进行开发。但是在没有提供对应SDK的场景下(小程序),这时候就要自行计算。
以Header中携带签名为例,计算得到签名(Signature)后,返回签名头域(OBS AccessKeyID:Signature)。

签名的计算方法如下(计算得到签名,但是这里返回了签名头域):
const Crypto = require('crypto-js')
/**
* 在Header中携带签名
* 必填项:access, secret
*/
const getAuthorization = function({method, contentType, contentMD5, date, canonicalizedHeaders, canonicalizedResource, access, secret}) {
// 指定HTTP方法,可选GET/PUT/DELETE/POST/OPTIONS
method = method || "GET"
// 指定请求的Header:Content-Type和Content-MD5
contentType = contentType || "text/plain"
contentMD5 = contentMD5 || ""
// Mon, 06 Feb 2023 21:18:15 GMT
date = date || ''
// canonicalizedHeaders
// canonicalizedHeaders = "x-obs-acl:public-read\n"+'x-obs-storage-class:WARM\n'
canonicalizedHeaders = canonicalizedHeaders || ""
// canonicalizedResource
// canonicalizedResource = "/BucketName/ObjectName"
// canonicalizedResource = "/BucketName/ObjectName?acl"
canonicalizedResource = canonicalizedResource || '/'
// 生成StringToSign
let stringToSign = method + "\n" + contentMD5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedHeaders + canonicalizedResource
// 签名计算方法: Base64(HMACSHA1(SecretAccessKeyID, UTF-8-EncodingOf(StringToSign)))
// HMAC-SHA1签名计算
const bytes = Crypto.HmacSHA1(stringToSign, secret)
// 对计算结果进行Base64编码,得到最终的签名信息
const signature = Crypto.enc.Base64.stringify(bytes)
// 返回authorization
return `OBS ${access}:${signature}`
}
module.exports = {
getAuthorization
}
调用示例:
// 签名头域
const authorization = getAuthorization({
method: 'DELETE',
canonicalizedHeaders: `x-obs-date:${请求时间}\nx-obs-security-token:${你的临时securitytoken}\n`,
canonicalizedResource: `/${桶名}/${对象名}`,
secret: '你的临时SK',
access: '你的临时AK'
})
// 请求头中携带签名
header: {
Authorization: authorization,
'x-obs-date': '请求时间', // Mon, 06 Feb 2023 21:18:15 GMT
'x-obs-security-token': '你的临时securitytoken',
'content-type': 'text/plain'
},
参考官方文档
更多推荐
所有评论(0)