簡體   English   中英

Heroku Node.js Amazon S3直接上傳教程-SignatureDoesNotMatch

[英]Heroku Node.js Amazon S3 direct upload tutorial - SignatureDoesNotMatch

當簽名中帶有加號“ +”時,為什么Heroku Nodejs AWS S3教程( https://devcenter.heroku.com/articles/s3-upload-node )失敗?

摘要: 重新生成簽名,直到它不再包含加號“ +”

if (signature.indexOf('+') != -1) {
    setTimeout(function(){
        //regenerate signature until it doesn't contain + anymore
        generateSignature();
    }, 400);
}

我發現的有效解決方案由@chadsaun在此論壇帖子上建議: http ://www.uploadify.com/forum/#/discussion/comment/10777

完整的heroku示例代碼解決方案:

app.get('/sign_s3', function(req, res){
    var object_name = req.query.s3_object_name;
    var mime_type = req.query.s3_object_type;
    var amz_headers = "x-amz-acl:public-read";
    var signature, expires;
    function generateSignature() {
        var thisTime = new Date().getTime();
        expires = Math.ceil((thisTime + 10000)/1000);
        var put_request = "PUT\n\n" + mime_type + "\n" 
                        + expires + "\n" + amz_headers 
                        + "\n/" + S3_BUCKET + "/"
                        + object_name;

        signature = crypto.createHmac('sha1', AWS_SECRET_KEY)
                        .update(put_request)
                        .digest('base64');
        console.log(signature);

        if (signature.indexOf('+') != -1) {
            setTimeout(function(){
                //regenerate signature until it doesn't contain + anymore
                generateSignature();
            }, 400);
        } else {
            var url = 'https://' + S3_BUCKET + '.s3.amazonaws.com/' + object_name;
            var credentials = {
                signed_request: url + "?AWSAccessKeyId=" + AWS_ACCESS_KEY 
                                + "&Expires=" + expires + "&Signature=" 
                                + signature,
                url: url,
            };

            res.write(JSON.stringify(credentials));
            res.end();
        }
    }
    generateSignature();
});

我想您需要對您的簽名進行uri編碼。 像這樣:

signature = encodeURIComponent(
    crypto.createHmac('sha1', AWS_SECRET_KEY)
        .update(put_request)
        .digest('base64')
);

這樣,您無需檢查簽名是否包含“ +”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM