文档

Browser.js授权访问

更新时间:

本文介绍如何使用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的步骤如下:

  1. 搭建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")
    })

  2. 客户端使用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)?

  1. 生成上传的文件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();
    
  2. 使用签名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>
    

相关文档

  • 关于使用STS进行临时授权访问的完整示例代码,请参见GitHub示例

  • 关于使用签名URL进行临时授权访问的完整示例代码,请参见GitHub示例

  • 本页导读 (1)
文档反馈