搜索本产品文档关键词
原理篇三:STS临时认证
所有文档
menu

BOS 对象存储

原理篇三:STS临时认证

原理篇三:STS 临时认证

Bce-bos-uploader 支持 STS(Security Token Service) 临时授权的方式。服务端生成一组具体特定操作权限、具有一定时效性的临时 AK/SK ,这组临时的 AK/SK 可以暴露给浏览器端直接使用。用户只需要将服务端返回的 AK/SK 及 SessionToken 设置为 bce-bos-uploader 对应的 bos-ak、bos-sk 和 uptoken 参数。

关于 STS 方面的介绍请参考临时授权访问。使用流程:

  1. 配置应用服务器端 Nodejs 实现
  2. 获取临时 AK/SK/SessionToken
  3. 初始化 bce-bos-uploader 参数

应用服务器端 Nodejs 实现

Plain Text
1    var http = require('http');
2    var url = require('url');
3    var util = require('util');
4
5    var STS = require('@baiducloud/sdk').STS;
6
7    var kCredentials = {
8        ak: '您的AK',
9        sk: '您的SK'
10    };
11
12    function buildStsResponse() {
13        var stsClient = new STS({
14            credentials: kCredentials,
15            region: 'bj'
16        });
17        return stsClient.getSessionToken(60 * 60 * 24, {
18            accessControlList: [{
19                service: 'bce:bos',
20                resource: ['bce-javascript-sdk-demo-test'],
21                region: '*',
22                effect: 'Allow',
23                permission: ['READ', 'WRITE']
24            }]
25        }).then(function (response) {
26            var body = response.body;
27            return {
28                AccessKeyId: body.accessKeyId,
29                SecretAccessKey: body.secretAccessKey,
30                SessionToken: body.sessionToken,
31                Expiration: body.expiration
32            };
33        });
34    }
35
36    http.createServer(function (req, res) {
37        console.log(req.url);
38
39        var query = url.parse(req.url, true).query;
40
41        var promise = null;
42
43        if (query.sts) {
44            promise = buildStsResponse();
45        }
46
47        promise.then(function (payload) {
48            res.writeHead(200, {
49                'Content-Type': 'text/javascript; charset=utf-8',
50                'Access-Control-Allow-Origin': '*'
51            });
52
53            if (query.callback) {
54                res.end(util.format('%s(%s)', query.callback, JSON.stringify(payload)));
55            }
56            else {
57                res.end(JSON.stringify(payload));
58            }
59        });
60    }).listen(1337);
61    console.log('Server running at http://0.0.0.0:1337/');

在服务器端,用与创建 bosClient 实例类似的方式创建一个 stsClient 实例。对于 stsClient 实例,主要有一个方法,那就是 getSessionToken 。这个方法接收两个参数,第一个参数是临时授权的有效期,以秒为单位;第二个单位是具体的权限控制,参见STS服务接口

这个方法会异步访问 STS 授权服务器,返回一个 promise 对象。 STS 授权服务器会返回类似如下内容:

Plain Text
1    {   
2        body: {         
3            "accessKeyId": "d87a16e5ce1d47c1917b38ed03fbb329",
4            "secretAccessKey": "e9b6f59ce06c45cdaaea2296111dab46", 
5            "sessionToken": "MjUzZjQzNTY4OTE0NDRkNjg3N2E4YzJhZTc4YmU5ZDh8AAAAABwCAAB/HfHDVV2bu5xUf6rApt2YdSLG6+21UTC62EHvIuiaamtuMQQKNkR9PU2NJGVbuWgBn8Ot0atk0HnWYQGgwgyew24HtbrX3GFiR/cDymCowm0TI6OGq7k8pGuBiCczT8qZcarH7VdZBd1lkpYaXbtP7wQJqiochDXrswrCd+J/I2CeSQT6mJiMmvupUV06R89dWBL/Vcu7JQpdYBk0d5cp2B+gdaHddBobevlBmKQw50/oOykJIuho4Wn7FgOGPMPdod0Pf0s7lW/HgSnPOjZCgRl0pihs197rP3GWpnlJRyfdCY0g0GFG6T0/FsqDbxbi8lWzF1QRTmJzzh2Tax8xoPFKGMbpntp//vGP7oPYK1JoES34TjcdcZnLzIRnVIGaZAzmZMUhPEXE5RVX1w8jPEXMJJHSrFs3lJe13o9Dwg==",         
6            "createTime": "2016-02-16T14:01:29Z",         
7            "expiration": "2016-02-16T15:41:29Z",         
8            "userId": "5e433c4a8fe74765a7ec6fc147e25c80"     
9        } 
10    }

服务器端需要把 accessKeyId、secretAccessKey、sessionToken 三个字段下发给浏览器端。

浏览器前端实现

前端使用 STS 临时授权机制时,只需要在各个服务初始化的时候把上面所说的参数 accessKeyId、secretAccessKey、sessionToken 引入就可以了。以 BOS 为例:

Plain Text
1    var bosConfig = {
2         credentials: {
3             ak: '{accessKeyId}', // STS服务器下发的临时ak
4             sk: '{secretAccessKey}' // STS服务器下发的临时sk
5         },
6         sessionToken: '{sessionToken}',  // STS服务器下发的sessionToken
7         endpoint: 'http://bj.bcebos.com'
8     };
9    var client = new baidubce.sdk.BosClient(bosConfig);
上一篇
原理篇二:大文件分块上传
下一篇
手机美图APP实践