Доступ запрещен подписанный URL-адрес Python3 с использованием облачного интерфейса
Я пытаюсь создать подписанные URL-адреса для своего ведра s3, к которому только избранные люди будут иметь доступ до истечения времени.
Я не могу найти проблему в своем коде. Пожалуйста помоги
import boto
from boto.cloudfront import CloudFrontConnection
from boto.cloudfront.distribution import Distribution
import base64
import json
import rsa
import time
def lambda_handler(event, context):
url = "https://notYourUrl.com/example.html"
expires = int(time.time() + 36000)
pem = """-----BEGIN RSA PRIVATE KEY-----
myKey
-----END RSA PRIVATE KEY-----"""
Cloudfront console
key_pair_id = 'myKey'
policy = {
"Statement": [
{
"Resource":url,
"Condition":{
"DateLessThan":{"AWS:EpochTime":expires},
}
}
]
}
policy = json.dumps(policy)
private_key = rsa.PrivateKey.load_pkcs1(pem)
policy = policy.encode("utf-8")
signed = rsa.sign(policy, private_key, 'SHA-1')
policy = base64.b64encode(policy)
policy = policy.decode("utf-8")
signature = base64.urlsafe_b64encode(signed)
signature = signature.decode("utf-8")
policy = policy.replace("+", "-")
policy = policy.replace("=", "_")
policy = policy.replace("/", "~")
signature = signature.replace("+", "-")
signature = signature.replace("=", "_")
signature = signature.replace("/", "~")
print("%s?Expires=%s&Signature=%s&Key-Pair-Id=%s" % (url,expires, signature, key_pair_id))
Когда я тестирую файл на лямбда-выражении, я могу создать и распечатать URL-адрес, но когда я получаю доступ к URL-адресу, я получаю сообщение об ошибке отказа в доступе из XML-файла.
Я не уверен, что делаю сейчас не так. Чтобы проверить, могу ли я сгенерировать какой-либо SignedUrl, я создал лямбду node.js, в которой я могу успешно сгенерировать URL-адрес и даже получить доступ к своей странице.
<Error>
<Code>AccessDenied</Code>
<Message>Access denied</Message>
</Error>
1 ответ
После многих неудачных попыток заставить мой код работать, я решил использовать другой подход и использовал node.js, чтобы удовлетворить свои потребности. Приведенный ниже код работает отлично, и я могу сгенерировать подписанный URL-адрес
На данный момент я использовал жестко запрограммированное значение времени для тестирования своего кода и позже буду работать над получением этого динамического значения с помощью datetime.
var AWS = require('aws-sdk');
var keyPairId = 'myKeyPairId';
var privateKey = '-----BEGIN RSA PRIVATE KEY-----' + '\n' +
'-----END RSA PRIVATE KEY-----';
var signer = new AWS.CloudFront.Signer(keyPairId, privateKey);
exports.handler = function(event, context) {
var options = {url: "https://notYourUrl.com/example.html", expires: 1621987200, 'Content-Type': 'text/html'};
//console.log(options);
const cookies = signer.getSignedCookie(options);
const url = signer.getSignedUrl(options);
console.log("Printing URL "+url);
console.log(cookies);
};