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'
},

参考官方文档

https://support.huaweicloud.com/api-obs/obs_04_0009.html

https://support.huaweicloud.com/api-obs/obs_04_0010.html

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐