文档首页/ 对象存储服务 OBS/ SDK参考/ BrowserJS/ FAQ/ 如何在不暴露AKSK的条件下实现与OBS交互?
更新时间:2024-04-26 GMT+08:00

如何在不暴露AKSK的条件下实现与OBS交互?

使用BrowserJS SDK与OBS服务交互时,必须将AK/SK暴露到前端,这样会存在安全问题。为避免该问题出现,可让后端生成临时签名URL给前端后,前端再与OBS交互。

比如:实现上传功能。
// 后端使用NodeJS SDK
// 引入obs库
const ObsClient = require('esdk-obs-nodejs');
// 初始化
const obsClient = new ObsClient({
    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
    // 前端本身没有process对象,可以使用webpack类打包工具定义环境变量,就可以在代码中运行了。
    // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
    access_key_id: process.env.AccessKeyID,
    secret_access_key: process.env.SecretAccessKey,
    // 这里以中国-香港为例,其他地区请按实际情况填写
    server: 'https://obs.ap-southeast-1.myhuaweicloud.com'
});
// 以下三个参数由前端传给后端,方便后端计算签名
// 桶名
const bucketName = 'bucketName';
// 对象名称
const objectKey = 'object';
// Http请求方法
const method = 'PUT'
// 添加Content-Type,按文件类型填写,此处以text/plain为例
const headers = {
    'Content-Type' : 'text/plain'
}
// 计算签名URL,然后返给前端
const res = obsClient.createSignedUrlSync({ Method : method, Bucket : bucketName, Key: objectKey, Expires: 3600, Headers : headers });

// 前端拿到计算签名URL,向OBS发起Http请求
// 前端使用axios请求库 
const url = res.SignedUrl;
const file = document.getElementById('input[type=file]')[0].file
if (!file) {
   console.log('your file is undefined')
}

axios.put(url, file)
  .then(res => console.log(res))
  .catch(err => console.error(err));

在使用该方案时可能会遇到跨域问题,请按照以下步骤依次排查问题:

  1. 未配置跨域,需要在控制台配置CORS规则,请参考配置桶允许跨域请求
  2. 签名计算问题,请参考URL中携带签名排查签名参数是否正确,比如上述demo中,Axios的PUT方法会自动添加请求头,而后端生成的临时授权URL并没有参与计算,这个时候就会出现跨域问题,查看network标签查看相应的请求会出现403状态码,如下图所示。