2012-10-29 21 views
6

Ho URL registrati su Cloudfront che funzionano bene in PHP. Le politiche di bucket funzionano con i referrer HTTP su S3, ma poiché Cloudfront non supporta i referrer HTTP, devo servire un file solo a un indirizzo IP (il client che ha richiesto il file e ha generato l'URL firmato o il mio server web idealmente).indirizzo IP firmato cloudfront indirizzo IP

Qualcuno può aiutarmi ad aggiungere l'elemento Indirizzo IP al codice JSON in modo che funzioni?

"IpAddress":{"AWS:SourceIp":"192.0.2.0/24"}, 

Mi sono perso con il PHP e dichiarazione politica, ma penso che potrebbe essere facile per qualcuno che conosce: http://tinyurl.com/9czr5lp

Lo fa codifica/firma di un po 'diverso per un criterio personalizzato: http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html#private-content-custom-policy-statement

Il seguente è un esempio AWS e funziona tranne che per il blocco dell'indirizzo IP.

Posso testarlo molto rapidamente se qualcuno può darmi una mano per due minuti!

Grazie in massa per qualsiasi aiuto :)

Jon

function getSignedURL($resource, $timeout) 
    { 
     $keyPairId = "XXXXXXXXXXXX"; 
     $expires = time() + $timeout; 
     $json = '{"Statement":[{"Resource":"'.$resource.'","Condition":{"DateLessThan":  {"AWS:EpochTime":'.$expires.'}}}]}'; 
     $fp=fopen("pk-XXXXXXXX.pem","r"); 

     $priv_key=fread($fp,8192); 
     fclose($fp); 

     $key = openssl_get_privatekey($priv_key); 
     if(!$key) 
     { 
       echo "<p>Failed to load private key!</p>"; 
       return; 
     } 

     //Sign the policy with the private key 

     if(!openssl_sign($json, $signed_policy, $key, OPENSSL_ALGO_SHA1)) 
     { 
       echo '<p>Failed to sign policy: '.openssl_error_string().'</p>'; 
       return; 
     } 
     //Create url safe signed policy 
     $base64_signed_policy = base64_encode($signed_policy); 
     $signature = str_replace(array('+','=','/'), array('-','_','~'), $base64_signed_policy); 
     //Construct the URL 
     $url = $resource.'?Expires='.$expires.'&Signature='.$signature.'&Key-Pair-Id='.$keyPairId; 
     return $url; 
} 
$url = getSignedURL("http://s675765.cloudfront.net/filename.mp4", 600); 
print $url; 

risposta

3
{"Statement":[{"Resource":"testRes","Condition":{"DateLessThan":{"AWS:EpochTime":1357034400},"IpAddress":{"AWS:SourceIp":"192.0.2.0\/24"}}}]} 

Questa è una stringa JSON valido valori pieni e sfuggiti. Se si passa l'indirizzo IP come variabile, assicurarsi di sfuggire allo /

ad es.

$escapedIp = str_replace('/', '\/', $ipAddress); 

Date un'occhiata al php JSON estensione Questo renderebbe le cose molto più facili:

esempio economico come array PHP

$statement = array( 
    'Statement' => array( 
     array(
      'Resource' => $resource, 
      'Condition' => array( 
       'DateLessThan' => array( 
        'AWS:EpochTime' => $expires 
       ), 
       'IpAddress' => array( 
        'AWS:SourceIp' => $ipAddress 
       ) 
      ) 
     ) 
    ) 
); 

$json = json_encode($statement); 
+0

Come convertire IP del client in formato CIDR ?? –

+0

Questo è un po 'troppo complicato da spiegare in un commento. Solitamente si limita a consentire l'intera gamma 0-255 troncando l'ultimo segmento a 0 e aggiungendo la maschera ottale/24. ad esempio, 10.0.0.1-10.0.0.255 sarebbe 10.0.0.0/24. Per informazioni generiche su CIDR, fare riferimento a http://en.m.wikipedia.org/wiki/Classless_Inter-Domain_Routing –

+0

Qualsiasi funzione di php per convertire il formato IP da 114.235.149.30 a CIDR ??? O posso usare solo 1 singolo IP 114.235.149.30 durante la firma? –