2012-06-29 3 views
2

Je voudrais savoir comment créer une URL signée pour cloudfront. La solution de travail actuelle n'est pas sécurisée et j'aimerais changer le système pour sécuriser les URL.Comment créer une URL cloudfront signée avec Python?

J'ai essayé d'utiliser Boto et Django 1.4 2.5.2

Y at-il un exemple de travail sur la façon d'utiliser la méthode boto.cloudfront.distribution.create_signed_url? ou toute autre solution qui fonctionne?

J'ai essayé le code suivant en utilisant l'API BOTO 2.5.2

def get_signed_url(): 
    import boto, time, pprint 
    from boto import cloudfront 
    from boto.cloudfront import distribution 
    AWS_ACCESS_KEY_ID = 'YOUR_AWS_ACCESS_KEY_ID' 
    AWS_SECRET_ACCESS_KEY = 'YOUR_AWS_SECRET_ACCESS_KEY' 
    KEYPAIR_ID = 'YOUR_KEYPAIR_ID' 
    KEYPAIR_FILE = 'YOUR_FULL_PATH_TO_FILE.pem' 
    CF_DISTRIBUTION_ID = 'E1V7I3IOVHUU02' 
    my_connection = boto.cloudfront.CloudFrontConnection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 
    distros = my_connection.get_all_streaming_distributions() 
    oai = my_connection.create_origin_access_identity('my_oai', 'An OAI for testing') 
    distribution_config = my_connection.get_streaming_distribution_config(CF_DISTRIBUTION_ID) 
    distribution_info = my_connection.get_streaming_distribution_info(CF_DISTRIBUTION_ID) 
    my_distro = boto.cloudfront.distribution.Distribution(connection=my_connection, config=distribution_config, domain_name=distribution_info.domain_name, id=CF_DISTRIBUTION_ID, last_modified_time=None, status='Active') 

    s3 = boto.connect_s3() 
    BUCKET_NAME = "YOUR_S3_BUCKET_NAME" 
    bucket = s3.get_bucket(BUCKET_NAME) 
    object_name = "FULL_URL_TO_MP4_ECLUDING_S3_URL_DOMAIN_NAME EG(my/path/video.mp4)" 
    key = bucket.get_key(object_name) 
    key.add_user_grant("READ", oai.s3_user_id) 

    SECS = 8000 
    OBJECT_URL = 'FULL_S3_URL_TO_FILE.mp4' 
    my_signed_url = my_distro.create_signed_url(OBJECT_URL, KEYPAIR_ID, expire_time=time.time() + SECS, valid_after_time=None, ip_address=None, policy_url=None, private_key_file=KEYPAIR_FILE, private_key_string=KEYPAIR_ID) 

Tout semble bien jusqu'à ce que la méthode create_signed_url. Il renvoie une erreur.

Exception Value: Only specify the private_key_file or the private_key_string not both 
+0

pour référence future couldfront sining url est cassé avec python3.4, espérons qu'il sauve quelqu'un de temps, pour plus de détails, consultez ce billet https://github.com/boto/boto/issues/2854?_pjax=%23js-repo -pjax-container – Aameer

Répondre

3

omettez le private_key_string:

my_signed_url = my_distro.create_signed_url(OBJECT_URL, KEYPAIR_ID, 
     expire_time=time.time() + SECS, private_key_file=KEYPAIR_FILE) 

Ce paramètre est utilisé pour transmettre le contenu réel du fichier clé privée, en tant que chaîne. Les commentaires dans the source expliquent qu'un seul de private_key_file ou private_key_string doit être passé.

Vous pouvez également omettre tous les kwargs qui sont définis sur None, car None est la valeur par défaut.

+0

Bonjour Chris, Nous vous remercions de votre suggestion. Je l'ai essayé et il renvoie une erreur: Django Version: 1.4 \t Exception Type: \t RSAError Exception Valeur: \t aucune ligne de départ Savez-vous ce qui pourrait provoquer le problème? Merci à l'avance! – ipegasus

+0

Peu importe. Ça marche. Le problème était lié à un fichier de clé privée cloudfront incorrect. Je geenrated une nouvelle clef via la page d'identification de sécurité d'AWS d'amazon et cela fonctionne. Merci de votre aide! – ipegasus

Questions connexes