Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在amazon s3图像上载中放置http请求403错误_Python_Amazon Web Services_Amazon S3 - Fatal编程技术网

Python 在amazon s3图像上载中放置http请求403错误

Python 在amazon s3图像上载中放置http请求403错误,python,amazon-web-services,amazon-s3,Python,Amazon Web Services,Amazon S3,我正在学习AmazonS3图像上传教程。一切似乎都很好。我的签名url响应返回200个状态码。但是,最后一个上载函数抛出403状态代码 function upload_file(file, signed_request, url){ var xhr = new XMLHttpRequest(); xhr.open("PUT", signed_request); xhr.setRequestHeader('x-amz-acl', 'public-read'); xh

我正在学习AmazonS3图像上传教程。一切似乎都很好。我的签名url响应返回200个状态码。但是,最后一个上载函数抛出403状态代码

function upload_file(file, signed_request, url){
    var xhr = new XMLHttpRequest();
    xhr.open("PUT", signed_request);
    xhr.setRequestHeader('x-amz-acl', 'public-read');
    xhr.onload = function() {
        if (xhr.status === 200) {
            document.getElementById("preview").src = url;
            document.getElementById("avatar_url").value = url;
        }
    };
    xhr.onerror = function() {
        alert("Could not upload file.");
    };
    xhr.send(file);
}
此处的请求会引发错误

    xhr.open("PUT", signed_request);
我检查了我的网络,看到一个成功的响应类型选项,带有200状态代码。但是,具有相同标头和属性的最后一次PUT类型的重新请求失败

我的密钥在下面的sign_s3 python函数中表示

@app.route('/sign_s3/')
def sign_s3():
    AWS_ACCESS_KEY = 'MY_AWS_ACCESS_KEY'  # string
    AWS_SECRET_KEY = 'MY_AWS_SECRET_KEY' #string
    S3_BUCKET = 'MY_S3_BUCKET' # string
    object_name = urllib.quote_plus(request.args.get('file_name'))
    mime_type = request.args.get('file_type')

    expires = int(time.time()+60*60*24)
    amz_headers = "x-amz-acl:public-read"

    string_to_sign = "PUT\n\n%s\n%d\n%s\n%s\n%s" % (mime_type, expires, amz_headers, S3_BUCKET, object_name)
   print "%s" %string_to_sign
   signature = base64.encodestring(hmac.new(AWS_SECRET_KEY.encode(), string_to_sign.encode('utf8'), sha1).digest())
   signature = urllib.quote_plus(signature.strip())

   url = 'https://%s.s3.amazonaws.com/%s' % (S3_BUCKET, object_name)

   content = json.dumps({
    'signed_request': '%s?AWSAccessKeyId=%s&Expires=%s&Signature=%s' % (url, AWS_ACCESS_KEY, expires, signature),
    'url': url,
    })
    return content

请问我哪里做错了?我正在一个地址为的本地主机上运行flask服务器。请问我哪里出错了?如有任何帮助,将不胜感激。

请再次注意格式:

StringToSign = HTTP-VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Expires + "\n" +
CanonicalizedAmzHeaders +
CanonicalizedResource; 

CanonicalizedResource
应该是

/bucket/object_name
…但是你的代码

string_to_sign = "PUT\n\n%s\n%d\n%s\n%s\n%s" % (mime_type, expires, amz_headers, S3_BUCKET, object_name)
…将创建以下内容:

bucket
object_name
…所以看起来您的格式字符串实际上需要

"PUT\n\n%s\n%d\n%s\n/%s/%s"

假设您的访问和密钥是正确的-您需要显示如何生成签名的完整来源。您是否在签名请求期间生成HMAC?@Birryrree我已更新了代码。请看上面。感谢403正文中的内容?回答为200的选项是飞行前的请求大量的流量肯定会回答问题,但在这一点上:要么你没有权限,要么你计算签名的方式错误,要么盒子上的时间不是UTC(导致错误签名)H@Michael。谢谢你的更正。它仍然抛出相同的禁止403状态代码错误。这让人困惑。
403
响应应该包括一个响应主体,如果签名过程出错,它可以为您提供有关签名过程出错原因的一些信息。如果我在这个答案中发现的明显的错误不是唯一的问题,那么您需要捕获该响应。。。请确保
AWSAccessKeyId
与被授予
s3:PutObject
s3:PutObjectAcl
权限的用户相对应。它确实存在错误
我们计算的请求签名与您提供的签名不匹配。我确认keyid和secret密钥都是正确的,但是它说计算的签名不匹配。错误很明显。但原因并非如此。