11// 临时密钥服务例子
2- var STS = require ( 'qcloud-cos-sts' ) ;
32var bodyParser = require ( 'body-parser' ) ;
3+ var STS = require ( 'qcloud-cos-sts' ) ;
44var express = require ( 'express' ) ;
5+ var crypto = require ( 'crypto' ) ;
56
67// 配置参数
78var config = {
@@ -52,9 +53,8 @@ app.all('/sts', function (req, res, next) {
5253 'statement' : [ {
5354 'action' : config . allowActions ,
5455 'effect' : 'allow' ,
55- 'principal' : { 'qcs' : [ '*' ] } ,
5656 'resource' : [
57- 'qcs::cos:ap-guangzhou :uid/' + AppId + ':prefix//' + AppId + '/' + ShortBucketName + '/' + config . allowPrefix ,
57+ 'qcs::cos:' + config . region + ' :uid/' + AppId + ':prefix//' + AppId + '/' + ShortBucketName + '/' + config . allowPrefix ,
5858 ] ,
5959 } ] ,
6060 } ;
@@ -63,12 +63,12 @@ app.all('/sts', function (req, res, next) {
6363 secretId : config . secretId ,
6464 secretKey : config . secretKey ,
6565 proxy : config . proxy ,
66+ region : config . region ,
6667 durationSeconds : config . durationSeconds ,
6768 policy : policy ,
6869 } , function ( err , tempKeys ) {
69- var result = JSON . stringify ( err || tempKeys ) || '' ;
70- result . startTime = startTime ;
71- res . send ( result ) ;
70+ if ( tempKeys ) tempKeys . startTime = startTime ;
71+ res . send ( err || tempKeys ) ;
7272 } ) ;
7373} ) ;
7474
@@ -105,15 +105,56 @@ app.all('/sts', function (req, res, next) {
105105// durationSeconds: config.durationSeconds,
106106// policy: policy,
107107// }, function (err, tempKeys) {
108- // var result = JSON.stringify(err || tempKeys) || '';
109- // result.startTime = startTime;
110- // res.send(result);
108+ // if (tempKeys) tempKeys.startTime = startTime;
109+ // res.send(err || tempKeys);
111110// });
112111// });
112+ //
113+ // 用于 PostObject 签名保护
114+ app . all ( '/post-policy' , function ( req , res , next ) {
115+ var query = req . query ;
116+ var now = Math . round ( Date . now ( ) / 1000 ) ;
117+ var exp = now + 900 ;
118+ var qKeyTime = now + ';' + exp ;
119+ var qSignAlgorithm = 'sha1' ;
120+ var policy = JSON . stringify ( {
121+ 'expiration' : new Date ( exp * 1000 ) . toISOString ( ) ,
122+ 'conditions' : [
123+ // {'acl': query.ACL},
124+ // ['starts-with', '$Content-Type', 'image/'],
125+ // ['starts-with', '$success_action_redirect', redirectUrl],
126+ // ['eq', '$x-cos-server-side-encryption', 'AES256'],
127+ { 'q-sign-algorithm' : qSignAlgorithm } ,
128+ { 'q-ak' : config . secretId } ,
129+ { 'q-sign-time' : qKeyTime } ,
130+ { 'bucket' : config . bucket } ,
131+ { 'key' : query . key } ,
132+ ]
133+ } ) ;
134+
135+ // 签名算法说明文档:https://www.qcloud.com/document/product/436/7778
136+ // 步骤一:生成 SignKey
137+ var signKey = crypto . createHmac ( 'sha1' , config . secretKey ) . update ( qKeyTime ) . digest ( 'hex' ) ;
113138
139+ // 步骤二:生成 StringToSign
140+ var stringToSign = crypto . createHash ( 'sha1' ) . update ( policy ) . digest ( 'hex' ) ;
141+
142+ // 步骤三:生成 Signature
143+ var qSignature = crypto . createHmac ( 'sha1' , signKey ) . update ( stringToSign ) . digest ( 'hex' ) ;
144+
145+ console . log ( policy ) ;
146+ res . send ( {
147+ policyObj : JSON . parse ( policy ) ,
148+ policy : Buffer . from ( policy ) . toString ( 'base64' ) ,
149+ qSignAlgorithm : qSignAlgorithm ,
150+ qAk : config . secretId ,
151+ qKeyTime : qKeyTime ,
152+ qSignature : qSignature ,
153+ // securityToken: securityToken, // 如果使用临时密钥,要返回在这个资源 sessionToken 的值
154+ } ) ;
155+ } ) ;
114156
115157app . all ( '*' , function ( req , res , next ) {
116- res . writeHead ( 404 ) ;
117158 res . send ( { code : - 1 , message : '404 Not Found' } ) ;
118159} ) ;
119160
0 commit comments