2016-10-28 162 views
0

我對AWS非常陌生,並且試圖允許用戶使用預先簽名的URL訪問/上載S3上的某些圖片。使用預簽名URL在Amazon S3上獲取或放置對象

這裏是我的代碼:

const getLinkForKey = key => new Promise((resolve, reject) => { 
 
    const params = {Bucket: PICTURES_BUCKET, Key: key}; 
 
    S3.getSignedUrl('getObject', params, (err, url) => err && reject(err) || resolve(url)); 
 
});

我收到從一個URL,但是當我嘗試訪問我收到的鏈接,我得到一個拒絕訪問異常。

我想我可能需要配置一些桶策略或類似的東西,但我對這個問題非常困惑。

你知道如何使這項工作?

謝謝,

+0

在存儲區權限中,允許'Everyone'能夠列出/查看文件。 – hjpotter92

+0

如果我這樣做,每個人都可以訪問thoses的照片,不是嗎?我想提供具體的鏈接給他們訪問特定的圖片 – Ereold

+0

如果你知道他們的IP,你可以創建一個策略。 – hjpotter92

回答

1

是的,預簽名的URL應該適合你。只是提供快速說明...

默認情況下,Amazon S3中的所有對象都是私有的。然後,您可以添加權限,以便人們可以訪問您的對象。這可以通過以下方式進行:

  • 對單個對象
  • 水桶策略的訪問控制列表的權限(即授權基於路徑,IP地址,引薦等範圍廣泛的訪問)
  • IAM用戶和組(即權限授予與AWS憑證用戶)
  • 前置簽名網址

Pre-Signed URL可用於授予訪問S3 OBJE cts作爲「覆蓋」訪問控制的一種方式。通常可以通過URL訪問一個通常爲私人對象的,並附上失效時間和簽名。這是在不需要Web服務器的情況下提供私人內容的好方法。

如果你的目標是服務內容只有在使用預簽名URL,然後:

  • 不分配通過上面列出的常規方法的任何權限(這讓他們的私人默認)
  • 使用前簽署的網址訪問對象

你的代碼是:

const getLinkForKey = key => new Promise((resolve, reject) => { 
    const params = {Bucket: PICTURES_BUCKET, Key: key}; 
    S3.getSignedUrl('getObject', params, (err, url) => err && reject(err) || resolve(url)); 
}); 

我注意到你是未通過Expires參數,它指定了預先簽名的URL的有效期。下面是從Amazon S3 documentation for node.js一個代碼示例:

var params = {Bucket: 'bucket', Key: 'key', Expires: 60}; 
var url = s3.getSignedUrl('getObject', params); 
console.log('The URL is', url); // expires in 60 seconds 

因此,很可能你測試的URL之前鏈接過期。我建議您提供一個Expires參數並將其設置爲適合您預期用途的長度(例如300秒)。

+0

在文檔上,據說默認情況下,Expires設置爲15分鐘。我仍然嘗試手動設置它,結果是一樣的,拒絕訪問: -/ – Ereold

+1

檢查您是否沒有其他策略會覆蓋安全性(儘管我不確定這適用於預先簽名的URL )。例如:桶策略應該可能爲空,簽名用戶的IAM權限不應該有DENY。您還可以通過[AWS命令行界面(CLI)](http://aws.amazon.com/cli/)['aws s3 presign'命令](http:// docs.aws.amazon.com/cli/latest/reference/s3/presign.html)。 –

+0

是否有可能我們可以從控制檯生成這些預定網址 –

0

我終於找出問題所在。我正在執行我的代碼到一個沒有正確訪問S3配置的lambda中。不幸的是,沒有任何錯誤可以幫助我找到它。它現在是固定的,並且鏈接工作:)

相關問題