一些背景信息,如何使用AWS Web API和Lambda驗證無服務器Web請求?
我已經建立了一個互動網站,用戶可以上傳圖片到S3。我構建它,以便使用簽名請求(python django後端)將圖像上傳從瀏覽器轉移到AWS S3。
現在的問題是,用戶希望能夠旋轉圖像。我同樣我想這樣設置,以便用戶的請求直接從瀏覽器中獲得。我構建了一個AWS Lambda函數,並將其附加到一個Web API,它將接受POST請求。我一直在測試,我終於找到了工作。該函數需要2個輸入,key
和rotate_direction
,它們作爲POST變量傳遞給Web API。他們進入event
變量的python函數。這裏是簡單的Lambda功能:
from __future__ import print_function
import boto3
import os
import sys
import uuid
from PIL import Image
s3_client = boto3.client('s3')
def rotate_image(image_path, upload_path, rotate_direction):
with Image.open(image_path) as image:
if rotate_direction == "right":
image.rotate(-90).save(upload_path)
else:
image.rotate(90).save(upload_path)
def handler(event, context):
bucket = 'the-s3-bucket-name'
key = event['key']
rotate_direction = event['rotate_direction']
download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)
upload_path = '/tmp/rotated_small-{}'.format(key)
s3_client.download_file(bucket, key, download_path)
rotate_image(download_path, upload_path, rotate_direction)
s3_client.delete_object(Bucket=bucket, Key=key)
s3_client.upload_file(upload_path, bucket, key)
return { 'message':'rotated' }
一切正常。所以現在我的問題是如何執行這種系統的某種認證?有關每個圖像的所有權詳細信息駐留在django Web服務器上。雖然所有圖像都被視爲「公開」,但我希望強制規定只允許每個圖像的所有者旋轉自己的圖像。
通過這個項目我已經被直接從瀏覽器進行內容的請求冒險進入新的領域。我可以理解我如何通過僅從Web服務器發出POST請求來控制訪問,我可以驗證圖像的所有權。請求來自瀏覽器還有可能嗎?
這是一個相當強的答案。非常感謝。將通過教程閱讀,看看如何整合這一點。我的應用程序實際上使用Firebase進行用戶身份驗證,但文件上傳使用來自服務器的「已批準的請求」(http://boto3.readthedocs.io/en/latest/guide/s3.html#generating-presigned-urls),以及在客戶端可以上傳圖像之前將其傳回客戶端。這似乎與你的技術,我可以跳過這一步(少服務器)。此外,現在所有的圖像都沒有任何特殊的前綴,所以我將不得不重新工作。 –
很高興你找到了解決辦法。是的,根據亞馬遜的文檔,您要麼以文件名爲前綴,要麼將圖像存儲在用戶標識前綴的文件夾名稱中。 – Frank
是的,現在你說這個,我意識到他們是如何處理我已經在其他項目上的文件命名。我想我並不需要它,因爲數據庫中的數據庫包含所有權信息,但現在我可以看到如何爲每個用戶提供特殊代碼的命名可以提供幫助。 –