进阶篇一:STS临时认证
所有文档

          对象存储 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 实现为例,服务器端会返回 AK/SK/SessionToken 。
          2. 配置浏览器,根据服务器端返回的 AK/SK/SessionToken 初始化 bce-bos-uploader 参数。

          应用服务器端 Nodejs 实现

          var http = require('http');
          var url = require('url');
          var util = require('util');
          
          var STS = require('@baiducloud/sdk').STS;
          
          var kCredentials = {
              ak: '您的AK',
              sk: '您的SK'
          };
          
          function buildStsResponse() {
              var stsClient = new STS({
                  credentials: kCredentials,
                  region: 'bj'
              });
              return stsClient.getSessionToken(60 * 60 * 24, {
                  accessControlList: [{
                      service: 'bce:bos',
                      resource: ['bce-javascript-sdk-demo-test'],
                      region: '*',
                      effect: 'Allow',
                      permission: ['READ', 'WRITE']
                  }]
              }).then(function (response) {
                  var body = response.body;
                  return {
                      AccessKeyId: body.accessKeyId,
                      SecretAccessKey: body.secretAccessKey,
                      SessionToken: body.sessionToken,
                      Expiration: body.expiration
                  };
              });
          }
          
          http.createServer(function (req, res) {
              console.log(req.url);
          
              var query = url.parse(req.url, true).query;
          
              var promise = null;
          
              if (query.sts) {
                  promise = buildStsResponse();
              }
          
              promise.then(function (payload) {
                  res.writeHead(200, {
                      'Content-Type': 'text/javascript; charset=utf-8',
                      'Access-Control-Allow-Origin': '*'
                  });
          
                  if (query.callback) {
                      res.end(util.format('%s(%s)', query.callback, JSON.stringify(payload)));
                  }
                  else {
                      res.end(JSON.stringify(payload));
                  }
              });
          }).listen(1337);
          console.log('Server running at http://0.0.0.0:1337/');

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

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

          {   
              body: {         
                  "accessKeyId": "d87a16e5ce1d47c1917b38ed03fbb329", 
                  "secretAccessKey": "e9b6f59ce06c45cdaaea2296111dab46",
                   "sessionToken": "MjUzZjQzNTY4OTE0NDRkNjg3N2E4YzJhZTc4YmU5ZDh8AAAAABwCAAB/HfHDVV2bu5xUf6rApt2YdSLG6+21UTC62EHvIuiaamtuMQQKNkR9PU2NJGVbuWgBn8Ot0atk0HnWYQGgwgyew24HtbrX3GFiR/cDymCowm0TI6OGq7k8pGuBiCczT8qZcarH7VdZBd1lkpYaXbtP7wQJqiochDXrswrCd+J/I2CeSQT6mJiMmvupUV06R89dWBL/Vcu7JQpdYBk0d5cp2B+gdaHddBobevlBmKQw50/oOykJIuho4Wn7FgOGPMPdod0Pf0s7lW/HgSnPOjZCgRl0pihs197rP3GWpnlJRyfdCY0g0GFG6T0/FsqDbxbi8lWzF1QRTmJzzh2Tax8xoPFKGMbpntp//vGP7oPYK1JoES34TjcdcZnLzIRnVIGaZAzmZMUhPEXE5RVX1w8jPEXMJJHSrFs3lJe13o9Dwg==",         
                  "createTime": "2016-02-16T14:01:29Z",         
                  "expiration": "2016-02-16T15:41:29Z",         
                  "userId": "5e433c4a8fe74765a7ec6fc147e25c80"     
              } 
          }

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

          配置浏览器端 bce-bos-uploader 参数

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

          <!doctype html>
          <html>
            <head>
              <meta charset="utf-8" />
              <title>bce-bos-uploader simple demo</title>
              <!--[if lt IE 8]><script src="http://websdk.cdn.bcebos.com/bos/json3/lib/json3.min.js"></script><![endif]-->
              <!--[if lt IE 9]><script src="http://websdk.cdn.bcebos.com/bos/js-polyfills/es5.js"></script><![endif]-->
              <!--[if lt IE 10]><script src="http://websdk.cdn.bcebos.com/bos/moxie/bin/js/moxie.js"></script><![endif]-->
              <!-- BOS不提供jquery.min.js,开发者可以自行引入在线资源或本地资源 -->
              <script src="./node_modules/jquery/dist/jquery.min.js"></script>
              <!-- 引入bce-bos-uploader.bundle.js,建议通过npm安装成功后,引入本地资源 -->
              <script src="./node_modules/@baiducloud/bos-uploader/dist/bce-bos-uploader.bundle.js"></script>
            </head>
            <body>
            
              <input type="file" id="file" >
              <script>
              var uploader = new baidubce.bos.Uploader({
                browse_button: '#file',
                bos_bucket: '<your bucket>',
                bos_endpoint: 'http://bj.bcebos.com',
                bos_ak: '<your ak>', 
                bos_sk: '<your sk>',
                uptoken: '<your sessionToken>'
              });
              </script>
            </body>
          </html>
          上一篇
          基础篇:在浏览器中直接上传文件到BOS
          下一篇
          进阶篇二:通过PostObject接口处理IE低版本