断点续传【授权访问】
本文介绍如何使用STS以及签名URL临时授权访问OSS资源。
授权方式
OSS支持多种授权方式进行客户端授权,以下提供了三种不同授权方式的简要说明,并提供了使用相应授权方式实现简单上传的代码示例,您可以根据使用场景对认证和授权的要求,参考对应的授权方式。
node.js
const express = require("express"); const { STS } = require('ali-oss'); const app = express(); const path = require("path"); app.use(express.static(path.join(__dirname, "templates"))); // 配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID。 const accessKeyId = process.env.ALIBABA_CLOUD_ACCESS_KEY_ID; // 配置环境变量ALIBABA_CLOUD_ACCESS_SECRET。 const accessKeySecret = process.env.ALIBABA_CLOUD_ACCESS_SECRET; app.get('/get_sts_token_for_oss_upload', (req, res) => { let sts = new STS({ accessKeyId: accessKeyId, accessKeySecret: accessKeySecret }); // roleArn填写步骤2获取的角色ARN,例如acs:ram::175708322470****:role/ramtest。 // policy填写自定义权限策略,用于进一步限制STS临时访问凭证的权限。如果不指定Policy,则返回的STS临时访问凭证默认拥有指定角色的所有权限。 // 3000为过期时间,单位为秒。 // sessionName用于自定义角色会话名称,用来区分不同的令牌,例如填写为sessiontest。 sts.assumeRole('<YOUR_ROLE_ARN>', ``, '3000', 'sessiontest').then((result) => { console.log(result); res.json({ AccessKeyId: result.credentials.AccessKeyId, AccessKeySecret: result.credentials.AccessKeySecret, SecurityToken: result.credentials.SecurityToken, }); }).catch((err) => { console.log(err); res.status(400).json(err.message); }); }); app.listen(8000, () => { console.log("http://127.0.0.1:8000"); });
客户端示例代码
web端使用临时访问凭证上传文件到OSS的示例代码如下
let credentials = null; const form = document.querySelector("form"); form.addEventListener("submit", async (event) => { event.preventDefault(); // 临时凭证过期时,才重新获取,减少对STS服务的调用。 if (isCredentialsExpired(credentials)) { const response = await fetch("/get_sts_token_for_oss_upload", { method: "GET", }); if (!response.ok) { // 处理错误的HTTP状态码。 throw new Error( `获取STS令牌失败: ${response.status} ${response.statusText}` ); } credentials = await response.json(); } const client = new OSS({ // 将<YOUR_BUCKET>设置为OSS Bucket名称。 bucket: "<YOUR_BUCKET>", // 将<YOUR_REGION>设置为OSS Bucket所在地域,例如region: 'oss-cn-hangzhou'。 region: "oss-<YOUR_REGION>", authorizationV4: true, accessKeyId: credentials.AccessKeyId, accessKeySecret: credentials.AccessKeySecret, stsToken: credentials.SecurityToken, }); const fileInput = document.querySelector("#file"); const file = fileInput.files[0]; const result = await client.put(file.name, file); console.log(result); }); /** * 判断临时凭证是否到期。 **/ function isCredentialsExpired(credentials) { if (!credentials) { return true; } const expireDate = new Date(credentials.Expiration); const now = new Date(); // 如果有效期不足一分钟,视为过期。 return expireDate.getTime() - now.getTime() <= 60000; }