function (opt) {
    opt = opt || {};

    var SecretId = opt.SecretId;
    var SecretKey = opt.SecretKey;
    var method = (opt.method || opt.Method || 'get').toLowerCase();
    var queryParams = clone(opt.Query || opt.params || {});
    var headers = clone(opt.Headers || opt.headers || {});

    var Key = opt.Key || '';
    var pathname;
    if (opt.UseRawKey) {
        pathname = opt.Pathname || opt.pathname || '/' + Key;
    } else {
        pathname = opt.Pathname || opt.pathname || Key;
        pathname.indexOf('/') !== 0 && (pathname = '/' + pathname);
    }

    if (!SecretId) return console.error('missing param SecretId');
    if (!SecretKey) return console.error('missing param SecretKey');

    var getObjectKeys = function (obj) {
        var list = [];
        for (var key in obj) {
            if (obj.hasOwnProperty(key)) {
                list.push(key);
            }
        }
        return list.sort(function (a, b) {
            a = a.toLowerCase();
            b = b.toLowerCase();
            return a === b ? 0 : (a > b ? 1 : -1);
        });
    };

    var obj2str = function (obj) {
        var i, key, val;
        var list = [];
        var keyList = getObjectKeys(obj);
        for (i = 0; i < keyList.length; i++) {
            key = keyList[i];
            val = (obj[key] === undefined || obj[key] === null) ? '' : ('' + obj[key]);
            key = key.toLowerCase();
            key = camSafeUrlEncode(key);
            val = camSafeUrlEncode(val) || '';
            list.push(key + '=' + val)
        }
        return list.join('&');
    };

    // 签名有效起止时间
    var now = Math.round(getSkewTime(opt.SystemClockOffset) / 1000) - 1;
    var exp = now;

    var Expires = opt.Expires || opt.expires;
    if (Expires === undefined) {
        exp += 900; // 签名过期时间为当前 + 900s
    } else {
        exp += (Expires * 1) || 0;
    }

    // 要用到的 Authorization 参数列表
    var qSignAlgorithm = 'sha1';
    var qAk = SecretId;
    var qSignTime = now + ';' + exp;
    var qKeyTime = now + ';' + exp;
    var qHeaderList = getObjectKeys(headers).join(';').toLowerCase();
    var qUrlParamList = getObjectKeys(queryParams).join(';').toLowerCase();

    // 签名算法说明文档：https://www.qcloud.com/document/product/436/7778
    // 步骤一：计算 SignKey
    var signKey = CryptoJS.HmacSHA1(qKeyTime, SecretKey).toString();

    // 步骤二：构成 FormatString
    var formatString = [method, pathname, obj2str(queryParams), obj2str(headers), ''].join('\n');

    // 步骤三：计算 StringToSign
    var stringToSign = ['sha1', qSignTime, CryptoJS.SHA1(formatString).toString(), ''].join('\n');

    // 步骤四：计算 Signature
    var qSignature = CryptoJS.HmacSHA1(stringToSign, signKey).toString();

    // 步骤五：构造 Authorization
    var authorization = [
        'q-sign-algorithm=' + qSignAlgorithm,
        'q-ak=' + qAk,
        'q-sign-time=' + qSignTime,
        'q-key-time=' + qKeyTime,
        'q-header-list=' + qHeaderList,
        'q-url-param-list=' + qUrlParamList,
        'q-signature=' + qSignature
    ].join('&');

    return authorization;

}
function (opt) {
    opt = opt || {};

    var SecretId = opt.SecretId;
    var SecretKey = opt.SecretKey;
    var method = (opt.method || opt.Method || 'get').toLowerCase();
    var queryParams = clone(opt.Query || opt.params || {});
    var headers = clone(opt.Headers || opt.headers || {});

    var Key = opt.Key || '';
    var pathname;
    if (opt.UseRawKey) {
        pathname = opt.Pathname || opt.pathname || '/' + Key;
    } else {
        pathname = opt.Pathname || opt.pathname || Key;
        pathname.indexOf('/') !== 0 && (pathname = '/' + pathname);
    }

    if (!SecretId) return console.error('missing param SecretId');
    if (!SecretKey) return console.error('missing param SecretKey');

    var getObjectKeys = function (obj) {
        var list = [];
        for (var key in obj) {
            if (obj.hasOwnProperty(key)) {
                list.push(key);
            }
        }
        return list.sort(function (a, b) {
            a = a.toLowerCase();
            b = b.toLowerCase();
            return a === b ? 0 : (a > b ? 1 : -1);
        });
    };

    var obj2str = function (obj) {
        var i, key, val;
        var list = [];
        var keyList = getObjectKeys(obj);
        for (i = 0; i < keyList.length; i++) {
            key = keyList[i];
            val = (obj[key] === undefined || obj[key] === null) ? '' : ('' + obj[key]);
            key = key.toLowerCase();
            key = camSafeUrlEncode(key);
            val = camSafeUrlEncode(val) || '';
            list.push(key + '=' + val)
        }
        return list.join('&');
    };

    
    var now = Math.round(getSkewTime(opt.SystemClockOffset) / 1000) - 1;
    var exp = now;

    var Expires = opt.Expires || opt.expires;
    if (Expires === undefined) {
        exp += 900; 
    } else {
        exp += (Expires * 1) || 0;
    }

    
    var qSignAlgorithm = 'sha1';
    var qAk = SecretId;
    var qSignTime = now + ';' + exp;
    var qKeyTime = now + ';' + exp;
    var qHeaderList = getObjectKeys(headers).join(';').toLowerCase();
    var qUrlParamList = getObjectKeys(queryParams).join(';').toLowerCase();

    
    
    var signKey = CryptoJS.HmacSHA1(qKeyTime, SecretKey).toString();

    
    var formatString = [method, pathname, obj2str(queryParams), obj2str(headers), ''].join('\n');

    
    var stringToSign = ['sha1', qSignTime, CryptoJS.SHA1(formatString).toString(), ''].join('\n');

    
    var qSignature = CryptoJS.HmacSHA1(stringToSign, signKey).toString();

    
    var authorization = [
        'q-sign-algorithm=' + qSignAlgorithm,
        'q-ak=' + qAk,
        'q-sign-time=' + qSignTime,
        'q-key-time=' + qKeyTime,
        'q-header-list=' + qHeaderList,
        'q-url-param-list=' + qUrlParamList,
        'q-signature=' + qSignature
    ].join('&');

    return authorization;

}
function ( opt ) { opt = opt || { } ; var SecretId = opt . SecretId ; var SecretKey = opt . SecretKey ; var method = ( opt . method || opt . Method || 'get' ) . toLowerCase ( ) ; var queryParams = clone ( opt . Query || opt . params || { } ) ; var headers = clone ( opt . Headers || opt . headers || { } ) ; var Key = opt . Key || '' ; var pathname ; if ( opt . UseRawKey ) { pathname = opt . Pathname || opt . pathname || '/' + Key ; } else { pathname = opt . Pathname || opt . pathname || Key ; pathname . indexOf ( '/' ) !== 0 && ( pathname = '/' + pathname ) ; } if ( ! SecretId ) return console . error ( 'missing param SecretId' ) ; if ( ! SecretKey ) return console . error ( 'missing param SecretKey' ) ; var getObjectKeys = function ( obj ) { var list = [ ] ; for ( var key in obj ) { if ( obj . hasOwnProperty ( key ) ) { list . push ( key ) ; } } return list . sort ( function ( a , b ) { a = a . toLowerCase ( ) ; b = b . toLowerCase ( ) ; return a === b ? 0 : ( a > b ? 1 : - 1 ) ; } ) ; } ; var obj2str = function ( obj ) { var i , key , val ; var list = [ ] ; var keyList = getObjectKeys ( obj ) ; for ( i = 0 ; i < keyList . length ; i ++ ) { key = keyList [ i ] ; val = ( obj [ key ] === undefined || obj [ key ] === null ) ? '' : ( '' + obj [ key ] ) ; key = key . toLowerCase ( ) ; key = camSafeUrlEncode ( key ) ; val = camSafeUrlEncode ( val ) || '' ; list . push ( key + '=' + val ) } return list . join ( '&' ) ; } ; // 签名有效起止时间 var now = Math . round ( getSkewTime ( opt . SystemClockOffset ) / 1000 ) - 1 ; var exp = now ; var Expires = opt . Expires || opt . expires ; if ( Expires === undefined ) { exp += 900 ; // 签名过期时间为当前 + 900s } else { exp += ( Expires * 1 ) || 0 ; } // 要用到的 Authorization 参数列表 var qSignAlgorithm = 'sha1' ; var qAk = SecretId ; var qSignTime = now + ';' + exp ; var qKeyTime = now + ';' + exp ; var qHeaderList = getObjectKeys ( headers ) . join ( ';' ) . toLowerCase ( ) ; var qUrlParamList = getObjectKeys ( queryParams ) . join ( ';' ) . toLowerCase ( ) ; // 签名算法说明文档：https://www.qcloud.com/document/product/436/7778 // 步骤一：计算 SignKey var signKey = CryptoJS . HmacSHA1 ( qKeyTime , SecretKey ) . toString ( ) ; // 步骤二：构成 FormatString var formatString = [ method , pathname , obj2str ( queryParams ) , obj2str ( headers ) , '' ] . join ( '\n' ) ; // 步骤三：计算 StringToSign var stringToSign = [ 'sha1' , qSignTime , CryptoJS . SHA1 ( formatString ) . toString ( ) , '' ] . join ( '\n' ) ; // 步骤四：计算 Signature var qSignature = CryptoJS . HmacSHA1 ( stringToSign , signKey ) . toString ( ) ; // 步骤五：构造 Authorization var authorization = [ 'q-sign-algorithm=' + qSignAlgorithm , 'q-ak=' + qAk , 'q-sign-time=' + qSignTime , 'q-key-time=' + qKeyTime , 'q-header-list=' + qHeaderList , 'q-url-param-list=' + qUrlParamList , 'q-signature=' + qSignature ] . join ( '&' ) ; return authorization ; }
测试用的key后面可以去掉
测试用的key后面可以去掉