2010-04-13 11 views
5

Histoire:Créer signé urls pour CloudFront avec Ruby

  1. J'ai créé un fichier de clé et GDP sur Amazon.
  2. J'ai créé un seau privé
  3. J'ai créé une distribution publique et id origine utilisé pour se connecter au seau privé: Travaux
  4. J'ai créé une distribution privée et connecté la même chose que # 3 - maintenant je refuser l'accès :

J'ai vraiment du mal à générer une URL qui fonctionnera. J'ai essayé de suivre les instructions décrites ici: http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?PrivateContent.html

C'est ce que j'ai jusqu'à présent ... ne fonctionne pas bien - encore avoir accès refusé:

def url_safe(s) 
    s.gsub('+','-').gsub('=','_').gsub('/','~').gsub(/\n/,'').gsub(' ','') 
end 

def policy_for_resource(resource, expires = Time.now + 1.hour) 
    %({"Statement":[{"Resource":"#{resource}","Condition":{"DateLessThan":{"AWS:EpochTime":#{expires.to_i}}}}]}) 
end 

def signature_for_resource(resource, key_id, private_key_file_name, expires = Time.now + 1.hour) 
    policy = url_safe(policy_for_resource(resource, expires)) 
    key = OpenSSL::PKey::RSA.new(File.readlines(private_key_file_name).join("")) 
    url_safe(Base64.encode64(key.sign(OpenSSL::Digest::SHA1.new, (policy)))) 
end 

def expiring_url_for_private_resource(resource, key_id, private_key_file_name, expires = Time.now + 1.hour) 
    sig = signature_for_resource(resource, key_id, private_key_file_name, expires) 
    "#{resource}?Expires=#{expires.to_i}&Signature=#{sig}&Key-Pair-Id=#{key_id}" 
end 

resource = "http://d27ss180g8tp83.cloudfront.net/iwantu.jpeg" 
key_id = "APKAIS6OBYQ253QOURZA" 
pk_file = "doc/pk-APKAIS6OBYQ253QOURZA.pem" 
puts expiring_url_for_private_resource(resource, key_id, pk_file) 

Quelqu'un peut-il dire moi ce que je fais mal ici?

Répondre

11

Tous,

Je viens de créer un petit petit bijou qui peut être utilisé pour signer des URL CF avec Ruby en utilisant une partie du code de cette question:

https://github.com/stlondemand/aws_cf_signer

Je vais probablement apporter des changements importants à ce au cours des prochaines semaines que je tr Pour l'utiliser dans mon application, je voulais vous le faire savoir car vous êtes dans la section attributions. :)

Merci!

1

Oui, en laissant la politique comme policy = policy_for_resource(resource, expires) a fonctionné pour moi.

1

Je fourchue right_aws (ils ont pas répondu à ma demande de traction) ... Je mis en place le streaming privé CloudFront et téléchargements dans leur bibliothèque acf: http://github.com/wiseleyb/right_aws

1

Je suis d'accord avec Dylan. Il a fait du bon travail en signant des urls. J'ai eu le même problème. Je suis allé à travers les docs. Il y a une chose que je n'ai pas trouvée là-bas. Lorsque vous créez une distribution privée, vous donnez généralement l'accès aux fichiers, au compartiment, etc.

J'ai reçu des erreurs Accès refusé jusqu'à ce que j'attribue une stratégie de compartiment.

Vous pouvez assigner la politique comme:

{ 
    "Version":"2008-10-17", 
    "Id":"PolicyForCloudFrontPrivateContent", 
    "Statement":[{ 
      "Sid":" Grant a CloudFront Origin Identity access to support private content", 
      "Effect":"Allow", 
      "Principal":{ 
      "CanonicalUser":"here-goes-your-canonical-name-you-attached-to-cloudfront79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be" 
      }, 
      "Action":"s3:GetObject", 
      "Resource":"arn:aws:s3:::change-me-to-your-bucketname/*" 
     } 
    ] 
}