JS通过STS访问阿里云OSS

本文介绍如何使用JavaScript和阿里云STS服务实现对OSS的临时授权访问。通过引入aliyun-oss-sdk库,结合STS服务器返回的临时授权信息,实现文件上传功能。

JS通过STS访问阿里云OSS

1.假设你已经配置好了STS服务器并能够返回客户端需要的全部信息;要是不知道如何配置,请看我的文章《使用 STS 进行OSS临时授权访问》
2. 需要引入JS文件 http://gosspublic.alicdn.com/aliyun-oss-sdk-4.4.4.min.js
3. 拷贝以下代码测试

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-4.4.4.min.js"></script>
    <script src="**************/js/axios.min.js"></script>
</head>

<style>

</style>

<body class="">
	<div class="">
        <input class="center-block" type="file" id="file" />
	</div>
</body>
    <script>

        document.getElementById('file').addEventListener('change', function (e) {
            var file = e.target.files[0];
            //请求你的STS服务器,获取临时授权;
			axios.get("your-sts-server")
				.then(function (res) {
					res = res.data.data;
					//使用STS临时授权数据初始化OSS对象
					var client = new OSS.Wrapper({
						accessKeyId: res.accessKeyId,
						accessKeySecret: res.accessKeySecret,
						stsToken: res.stsToken,
						endpoint: res.endpoint,
						bucket: res.bucket
					});
					//调用OSS的上传方法,将file上传到res.filepath,这里我的目标文件路径是服务器返回的。
					client.multipartUpload(res.filepath, file, { 
						progress: async function(a, b){	//上传进度回调;
							console.log(a, b);
						}
					})
					.then(function (res) {
						console.log('success');	//上传完成;
					})
					.catch(function (err) {
						console.log('fail');
						console.log(err);
					});
				})
				.catch(function (e) {
					console.log('fail');
					console.log(e);
				});
        });
    </script>
</html>

顺便贴上我的STS服务端代码吧(node.js)

PHP版本服务端代码点这里-拉到底部

let OSS = require('ali-oss');
class ZytAliOss {
	constructor(param) {
		this.accessKeyId = param.accessKeyId;
		this.accessKeySecret = param.accessKeySecret;
		this.rolearn = param.rolearn;
		this.region = param.region;
		this.endpoint = param.endpoint;
		this.bucket = param.bucket;
	}

	async CreateSTS(filepath, policy, expiration, sessionName, callback) {
		try {
			let sts = new OSS.STS({ accessKeyId: this.accessKeyId, accessKeySecret: this.accessKeySecret });
			policy = JSON.stringify(policy);
			let token = await sts.assumeRole(this.rolearn, policy, expiration, sessionName);
			let client = new OSS({
				region: this.region,
				accessKeyId: token.credentials.AccessKeyId,
				accessKeySecret: token.credentials.AccessKeySecret,
				stsToken: token.credentials.SecurityToken,
				bucket: this.bucket
			});
			let res = {};
			res.region = this.region;
			res.endpoint = this.endpoint;
			res.bucket = client.options.bucket;
			res.accessKeyId = client.options.accessKeyId;
			res.accessKeySecret = client.options.accessKeySecret;
			res.stsToken = client.options.stsToken;
			res.filepath = filepath;
			callback(res);
		} catch (e) {
			callback(null);
		}
	}

	async GetWriteSTS(filepath, expiration, sessionName, callback) {
		let policy = {
			Statement: [{
				Action: [
					"oss:PutObject",
					"oss:ListParts",
					"oss:AbortMultipartUpload"
				],
				Effect: "Allow",
				Resource: ["acs:oss:*:*:" + this.bucket + "/" + filepath]
			}],
			Version: "1"
		};
		this.CreateSTS(filepath, policy, expiration, sessionName, callback);
	}

	async GetReadSTS(filepath, expiration, sessionName, callback) {
		let policy = {
			Statement: [{
				Action: [
					"oss:GetObject",
					"oss:ListParts"
				],
				Effect: "Allow",
				Resource: ["acs:oss:*:*:" + this.bucket + "/" + filepath]
			}],
			Version: "1"
		};
		this.CreateSTS(filepath, policy, expiration, sessionName, callback);
	}

}

module.exports = ZytAliOss;

调用


	let oss = new ZytAliOss({
		accessKeyId: accessKeyId
		accessKeySecret: 'accessKeySecret',
		rolearn: 'acs:ram::*************:role/**************',
		region: 'oss-*********',
		bucket: 'bucket',
		endpoint: 'oss-********.aliyuncs.com'
	});
	oss.GetWriteSTS("test.jpg", 15*60, 'zzzz', async function(data){
		res.send({success:true, data:data});
	});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值