2015-12-31 208 views
1

我正在關注亞馬遜s3圖片上傳教程here。一切似乎都很好。我的簽名url響應返回200狀態碼。但是,上一次上傳功能正在拋出403狀態碼。PUT http請求403錯誤亞馬遜s3圖片上傳

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類型的最後一次重新獲取失敗。

我的鑰匙在下面

@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 

請我在哪裏可以得到我的錯蟒蛇sign_s3功能的代表?我在本地主機上運行我的燒瓶服務器,地址爲http://127.0.0.1:8080/。請問我哪裏錯了?任何幫助,將不勝感激。

+0

假設你的訪問和祕密密鑰是正確的 - 您需要顯示如何生成簽名的完整源代碼。您在簽名請求期間是否生成HMAC? – birryree

+0

@birryree我已更新我的代碼。請參閱上文。謝謝 –

+0

403身上有什麼? – Mircea

回答

1

注意格式,再次:

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

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth

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" 
+0

H @Michael。感謝您的更正。它仍會拋出相同的禁止403狀態碼錯誤。它令人困惑。 –

+0

如果簽名過程出錯,403響應應該包含一個響應主體,該主體爲您提供一些有關您的簽名過程出了什麼問題的信息。如果我在這個答案中發現的明顯錯誤不是唯一的問題,那麼您將需要捕獲該答覆。 –

+0

但是...確保'AWSAccessKeyId'對應於已被授予's3:PutObject' **和**'s3:PutObjectAcl'權限的用戶。 –