OSS使用STS进行临时授权

42 min read

步骤1:创建RAM用户

  1. 登录RAM控制台。
  2. 在左侧导航栏选择身份管理 > 用户。
  3. 单击“创建用户”。
  4. 输入登录名称和显示名称。
  5. 在访问方式区域选择“OpenAPI调用访问”,然后单击“确定”。
  6. 完成安全验证。
  7. 复制访问密钥(AccessKey ID 和 AccessKey Secret)。

步骤2:为RAM用户授予请求AssumeRole的权限

  1. 在RAM用户右侧单击“添加权限”。
  2. 在添加权限页面选择系统策略“AliyunSTSAssumeRoleAccess”。
  3. 单击“确定”。

步骤3:创建用于获取临时访问凭证的角色

根据具体业务需求创建角色并配置角色信任策略。

步骤4:为角色授予上传和下载文件的权限

配置角色策略,授予角色OSS访问权限。

步骤5:生成临时访问凭证

通过RAM用户调用AssumeRole接口获取临时访问凭证。

步骤6:使用临时访问凭证上传和下载文件

使用获取的临时访问凭证进行OSS操作,如上传和下载文件。

使用签名URL进行临时授权

注意事项

  • 生成签名URL过程中,SDK利用本地存储的密钥信息,根据特定算法计算出签名,并将其附加到URL上,以确保URL的有效性和安全性。
  • 生成签名URL时不需要授予调用者特定权限,但需要确保调用生成签名URL接口的身份主体被授予对应的权限。
  • 通过签名URL上传文件时,需要授予oss:PutObject权限;下载或预览文件时,需要授予oss:GetObject权限。
  • 签名URL中的特殊符号+可能需要替换为%2B

生成签名URL并上传文件

const OSS = require("ali-oss");
const { default: axios } = require("axios");
const fs = require("fs");

const client = new OSS({
  region: 'yourregion',
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  bucket: 'examplebucket',
});

// 生成文件的签名URL
const url = client.signatureUrl("examplefile.txt", {
  method: "PUT",
  "Content-Type": "application/x-www-form-urlencoded",
});

// 读取本地文件
const file = fs.readFileSync("D:\\localpath\\examplefile.txt");

// 使用签名URL上传文件
axios({
  url,
  method: "PUT",
  data: file,
})
  .then((r) => console.log(r))
  .catch((e) => console.log(e));

生成签名URL并下载文件

const OSS = require("ali-oss");
const { default: axios } = require("axios");
const fs = require("fs");

const client = new OSS({
  region: 'yourRegion',
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  bucket: 'examplebucket'
});

// 生成文件的签名URL
const url = client.signatureUrl("examplefile.txt");

// 本地文件路径
const file = "D:\\localpath\\examplefile.txt";

// 通过签名URL下载文件
axios({
  url,
  method: "GET",
})
  .then((r) => {
    fs.writeFile(file, r.data, (err) => {
      if (err) {
        console.log(err);
      }
    });
  })
  .catch((e) => console.log(e));

常见问题

生成签名URL时仅支持使用PUT和GET方法。如果需要通过POST方法进行上传,请参考PostObject自行构造POST请求。