本文介绍如何使用STS以及签名URL临时授权访问OSS资源。
重要
由于STS临时账号以及签名URL均需设置有效时长,当您使用STS临时账号生成签名URL执行相关操作(例如上传、下载文件)时,以最小的有效时长为准。例如您的STS临时账号的有效时长设置为1200秒、签名URL设置为3600秒时,当有效时长超过1200秒后,您无法使用此STS临时账号生成的签名URL上传文件。
使用STS进行临时授权
OSS可以通过阿里云STS(Security Token Service)进行临时授权访问。阿里云STS是为云计算用户提供临时访问令牌的Web服务。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。关于STS的更多信息,请参见STS介绍。
STS的优势如下:
您无需透露您的长期密钥(AccessKey)给第三方应用,只需生成一个访问令牌并将令牌交给第三方应用。您可以自定义这个令牌的访问权限及有效期限。
您无需关心权限撤销问题,访问令牌过期后自动失效。
通过STS临时授权访问OSS的步骤如下:
搭建STS Server。
// 通过STS服务生成临时访问凭证。临时访问凭证包括临时访问密钥(AccessKeyId和AccessKeySecret)和安全令牌(SecurityToken)。 const { STS } = require('ali-oss'); const express = require("express"); const app = express(); app.get('/sts', (req, res) => { let sts = new STS({ // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 accessKeyId: process.env.OSS_ACCESS_KEY_ID, accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET }); // roleArn填写角色ARN。 // policy填写自定义权限策略。 // expiration用于设置临时访问凭证有效时间单位为秒,最小值为900,最大值以当前角色设定的最大会话时间为准。 // sessionName用于自定义角色会话名称,用来区分不同的令牌,例如填写为SessionTest。 sts.assumeRole('acs:ram::137918634953****:role/ossram', `{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:*" ], "Resource": [ "acs:oss:*:*:examplebucket", "acs:oss:*:*:examplebucket/*" ] } ] }`, '3600', 'SessionTest').then((result) => { console.log(result); res.set('Access-Control-Allow-Origin', '*'); res.set('Access-Control-Allow-METHOD', 'GET'); res.json({ AccessKeyId: result.credentials.AccessKeyId, AccessKeySecret: result.credentials.AccessKeySecret, SecurityToken: result.credentials.SecurityToken, Expiration: result.credentials.Expiration }); }).catch((err) => { console.log(err); res.status(400).json(err.message); }); }); app.listen(8000,()=>{ console.log("server listen on:8000") })
客户端使用STS凭证构造签名请求。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> <!--导入SDK文件--> <script type="text/javascript" src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js" ></script> <script type="text/javascript"> // 填写您的授权服务器地址,例如http://127.0.0.1:8000/sts。 fetch("yourStsServer") .then((resp) => resp.json()) .then((result) => { const store = new OSS({ // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。 accessKeyId: result.AccessKeyId, accessKeySecret: result.AccessKeySecret, // 从STS服务获取的安全令牌(SecurityToken)。 stsToken: result.SecurityToken, // 填写Bucket所在地域。以华东1(杭州)为例,设置region为oss-cn-hangzhou。 region: "oss-cn-hangzhou", // 填写Bucket名称,例如examplebucket。 bucket: "examplebucket", }); // 生成签名URL。 // 填写Object完整路径,例如oss.png。Object完整路径中不能包含Bucket名称。 const url = store.signatureUrl("oss.png"); console.log(url); }); </script> </body> </html>
使用签名URL进行临时授权
重要
如果要在前端使用带可选参数的签名URL,请确保在服务端生成该签名URL时设置的Content-Type与在前端使用时设置的Content-Type一致,否则可能出现SignatureDoesNotMatch错误。设置Content-Type的具体操作,请参见如何设置Content-Type(MIME)?。
生成上传的文件URL。
// 生成临时访问凭证。 const OSS = require("ali-oss"); const STS = require("ali-oss").STS; // const cors = require("cors"); const stsClient = new STS({ // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 accessKeyId: process.env.OSS_ACCESS_KEY_ID, accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET, }); // 填写存储空间名称,例如examplebucket。 const bucket = "examplebucket"; // yourRegion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。 const region = "yourRegion"; // 指定角色ARN。 const roleArn = "acs:ram::137918634953****:role/ossram"; const getSts = () => { stsClient .assumeRole( roleArn, `{ "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": [ "acs:oss:*:*:examplebucket/*" ] } ] }`, 3000 //指定SecurityToken过期时间。 ) .then((r) => { console.log("send:", r.credentials); const { SecurityToken, AccessKeyId, AccessKeySecret } = r.credentials; const client = new OSS({ bucket, region, accessKeyId: AccessKeyId, accessKeySecret: AccessKeySecret, stsToken: SecurityToken, refreshSTSTokenInterval: 9000, }); // 指定上传至Bucket的文件名称。 const url = client.asyncSignatureUrl("example.txt", { expires: 3600, method: "PUT", // 设置Content-Type。 "Content-Type": "text/plain;charset=UTF-8", }); console.log("url:", url); // client.put("example.txt", Buffer.from("body")).then((res) => { // console.log("res", res.url); // }); }); }; getSts();
使用签名URL上传文件。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> <script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script> <script> // 填写步骤1生成的签名URL。 const url = "yourSignatureUrl"; var xhr = new XMLHttpRequest(); xhr.open("PUT", url, true); xhr.onload = function () { // 请求结束后,在此处编写处理代码。 }; // xhr.send(null); xhr.send("string"); // xhr.send(new Blob()); // xhr.send(new Int8Array()); // xhr.send({ form: 'data' }); // xhr.send(document); </script> </body> </html>
相关文档
文档内容是否对您有帮助?