귀하의 사이트에서 프리미엄/비공개 콘텐츠를 제공하는 방법은 무엇입니까?
15909 단어 serverlesscloudpythonaws
미리 서명된 URL이란 무엇입니까?
미리 서명된 URL은 제한된 권한과 요청 시간을 제공하는 URL입니다. 그러면 미리 서명된 URL을 받는 사람은 누구나 개체에 액세스할 수 있습니다. 예를 들어 버킷에 파일이 있고 버킷과 객체가 모두 비공개인 경우 미리 서명된 URL을 생성하여 파일을 다른 사람과 공유할 수 있습니다.
미리 서명된 URL에 대한 몇 가지 중요한 사항
미리 서명된 URL을 만드는 방법은 무엇입니까?
객체에 대해 미리 서명된 URL을 생성할 때 보안 자격 증명을 제공하고 버킷 이름, 객체 키를 지정하고 방법 및 만료 시간을 지정해야 합니다.
Python에서는 Boto3를 사용하여 generate_presigned_url 메서드를 사용하여 URL을 생성할 수 있습니다.
response = s3_client.generate_presigned_url('get_object',
Params={'Bucket': bucket_name,
'Key': object_name},
ExpiresIn=expiration)
응답 개체에는 다음과 유사한 URL이 포함됩니다.
https://somebucketname-rep.s3.amazonaws.com/someFileName.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAQS3IOUWUZF7YSXGA%2F20200821%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20200821T051228Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=FwoGZXIvYXdzEH8aDCfJDxO0y6xQxYmdGCK2AXe71W%2FgZEg%2FSnSWC%2Fw%2FaJHeZ20M7OI7AqMEum5c98Chl6pSNPwE5Awsc3ySwokDF6L8a9wP0ceXWAmxT3WXLSoFeNHDbbEHfUKWnvGL8yFzAxdmf%2Fmi%2B5Tnl62td8Nad%2F0Ct1Sx11Mip1h2qdYxw80OX5bCTq7cAHHjpmupvaDt%2BZ3qVyIA9WZmeS63dCPOlieE9IiBZf%2FjxF4Mcs5w4ZIHtZL%2F3LvqMXAy3XfzCgnlYVZeCNczKLuv%2FfkFMi0mStwkzyO%2BfMIxWJ82GJmyNi7LZuY5r0Hx0mE%2BxLnre8jp9%2FACoV%2FM92GnsR0%3D&X-Amz-Signature=17046b630ad4dede85af1cd57204bba8adc462a1825a35d93e81b656c683ad75
브라우저에서 이 URL을 사용하여 개체에 액세스할 수 있습니다! 간단합니다..그렇죠?
액션으로 보자
이전 두 게시물in the first post 위에 이를 구현하려고 합니다. AWS KMS를 사용하여 암호 해독을 암호화하는 사용자 지정 자격 증명 브로커(가입/로그인)를 구현했습니다. second post에서 AWS STS를 AssumeRole에 사용하여 버킷 파일 이름을 읽었으며 이제 미리 서명된 URL을 사용하도록 확장합니다. github.com/rajanpanchal/aws-kms-sts에서 두 번째 게시물의 코드를 다운로드하고 수정합니다.
전체 프로세스는 다음과 같습니다.
Lamdba 폴더에서 showFiles.py 파일을 열고 미리 서명된 URL을 생성하는 기능을 추가합니다. getFilesList 함수에서 이 함수를 호출합니다.
def getSignedUrl(key,s3_client):
KeyUrl = {}
response = s3_client.generate_presigned_url('get_object',
Params={'Bucket': os.environ['filesBucket'],
'Key': key},
ExpiresIn=3600)
KeyUrl[key] = response
return KeyUrl
# Returns list of files from bucket using STS
def getFilesList():
sts_client = boto3.client('sts')
# Call the assume_role method of the STSConnection object and pass the role
# ARN and a role session name.
assumed_role_object=sts_client.assume_role(
RoleArn=os.environ['s3role'],
RoleSessionName="AssumeRoleSession1"
)
# From the response that contains the assumed role, get the temporary
# credentials that can be used to make subsequent API calls
credentials=assumed_role_object['Credentials']
# Use the temporary credentials that AssumeRole returns to make a
# connection to Amazon S3
s3_resource=boto3.resource(
's3',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'],
)
s3_client = boto3.client('s3',aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'])
bucket = s3_resource.Bucket(os.environ['filesBucket'])
files=[]
for obj in bucket.objects.all():
files.append(getSignedUrl(obj.key,s3_client))
return files
AssumeRole에서 얻은 임시 자격 증명을 사용하여 getSignedUrl 함수에서 Presigned URL을 생성합니다. getFilesList 함수는 파일 이름 목록과 미리 서명된 URL을 반환합니다.
이제 showFiles.html을 수정하여 응답을 반복하고 파일에 대한 링크를 만듭니다.
<html>
<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css" integrity="sha512-8bHTC73gkZ7rZ7vpqUQThUDhqcNFyYi2xgDgPDHc+GXVGHXq+xPjynxIopALmOPqzo9JZj0k6OqqewdGO3EsrQ==" crossorigin="anonymous" />
<script
src="https://code.jquery.com/jquery-3.1.1.min.js"
integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js"></script>
</head>
<body>
<div class="ui raised very text container">
<h1 class="ui header">File Access System</h1>
<i class="folder open icon"></i></i><div class="ui label">Files</div>
<div id="files" >Loading..</div>
</div>
</body>
<script>
fetch(" https://g4m3zpzp95.execute-api.us-east-2.amazonaws.com/Prod/showFiles/", {
credentials: 'include'
})
.then(response => response.text())
.then((body) => {
var files="";
var obj = JSON.parse(body)
for (i = 0; i < obj.length; i++) {
var o = obj[i]
for(x in o){
files = files+ "<i class='file alternate outline icon'><a href='"+o[x]+"' target='_blank'> "+x+"</a>"
}
}
document.getElementById("files").innerHTML= files
})
.catch(function(error) {
console.log(error);
});
</script>
</html>
이제 SAM 빌드 및 배포를 수행합니다.
login.html, signup.html 및 showFiles.html을 수정하여 cloudformation 출력에서 api URL을 업데이트합니다.
이러한 파일을 버킷 stsexamplebucket 또는 생성한 버킷에 업로드합니다. 이 파일을 공개로 유지
여기에서 코드를 찾을 수 있습니다.
https://github.com/rajanpanchal/aws-kms-sts-presigned-url
테스트
질문이나 의견이 있으면 알려주세요!
Reference
이 문제에 관하여(귀하의 사이트에서 프리미엄/비공개 콘텐츠를 제공하는 방법은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rajanpanchal/how-to-serve-premium-private-content-on-your-site-41kl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)