2016-06-09 35 views
1

我在應用引擎端點中創建signedURL,然後將其提供給客戶端。但是,當客戶端嘗試使用標識的URL上傳,雲存儲引發以下錯誤使用簽名網址上傳到Google雲端存儲時面臨的問題

Access denied. Anonymous users does not have storage.objects.create access to bucket

App Engine的代碼來生成標識的URL如下:

private String getSignedUrl() { 
String encodedUrl = null; 
String httpVerb = "PUT"; 
String contentMD5 = ""; 
String contentType = "image/rgb"; 

Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.MINUTE, 10); 
long expiration = calendar.getTimeInMillis()/1000L; 
String canonicalizedExtensionHeaders = ""; 
String canonicalizedResource = 
    "/<bucket_name>/<folder_name>/"; 

String stringToSign = 
    httpVerb + "\n" + contentMD5 + "\n" + contentType + "\n" 
     + expiration + "\n" + canonicalizedExtensionHeaders 
     + canonicalizedResource; 

AppIdentityService service = 
    AppIdentityServiceFactory.getAppIdentityService(); 
String googleAccessId = service.getServiceAccountName(); 

String baseURL = 
    "http://storage.googleapis.com/<bucket_name>/<folder-name>/"; 
SigningResult signingResult = 
    service.signForApp(stringToSign.getBytes()); 
String encodedSignature = null; 
try { 
    encodedSignature = 
     URLEncoder.encode(
      new String(Base64.encodeBase64(
       signingResult.getSignature(), false), 
       "UTF-8"), "UTF-8").toString(); 
} catch (UnsupportedEncodingException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
encodedUrl = 
    baseURL + "?GoogleAccessId=" + googleAccessId + "&Expires=" 
     + expiration + "&Signature=" + encodedSignature; 

return encodedUrl; 
} 

,並獲得後簽名的URL,我正在使用cURL來測試上傳。我使用以下命令來上傳文件

curl -X PUT -H "Content-Type: multipart/form" -F [email protected]"<file_path>";type=image/rgb <signed_url> 

我已經在cURL中嘗試了POST和PUT,結果相同。 我在這裏錯過了什麼嗎?

+0

我不知道這是不是問題,但一般情況下,您可能想要爲HTTPS而不是HTTP簽名URL。 –

+0

即使使用https並根據@Andrei建議刪除文件夾名稱後,我無法從客戶端上傳。 –

回答

1

從內存寫入這裏,但我認爲你需要提供對象名稱。另外,您在baseURL中包含文件夾名稱 - 只應包含存儲桶名稱。 「文件夾」名稱是對象名稱的一部分。

+0

我其實想要生成簽名的URL,以便客戶可以上傳到GCS而無需使用Google帳戶。因此,基本URL中沒有對象名稱。正如你所建議的,我已經從代碼中的'canonicalizedResource'和'baseURL'中刪除了文件夾名稱。現在我正在觀察以下錯誤響應'MissingSecurityHeader您的請求缺少必需的標題。

授權
' –

+0

您可以檢查客戶端以確定它正在發送URL查詢參數嗎?這聽起來像是如果它一路剝離Signature參數會發生的事情。值得嘗試的另一件事是給客戶一個已知的好籤名URL來查看它是否有效。 gsutil實用程序可以爲您生成它們。 –

+0

@SudarshanMurthy:工作流程是這樣的:要求用戶選擇要上傳的文件,獲取文件名稱,從後端請求籤名的URL,將此URL設置爲文件上傳表單,提交文件上傳表單。 –

0

您也可以URL編碼googleAccessIdencodedSignature因爲在服務帳戶電子郵件@符號和base64編碼字符串可能被解碼爲服務器的空間+性格。

相關問題