Доступ запрещен подписанный 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);
  
};
Другие вопросы по тегам