2012-10-29 44 views
6

Tôi đã ký URL trên Cloudfront hoạt động tốt trong PHP. Chính sách nhóm hoạt động với các liên kết HTTP trên S3 nhưng vì Cloudfront không hỗ trợ kiểm tra liên kết HTTP tôi chỉ cần phân phát tệp tới một địa chỉ IP (ứng dụng yêu cầu tệp và tạo URL đã ký hoặc máy chủ web của tôi một cách lý tưởng).địa chỉ ip đã đăng nhập trên đám mây có chữ ký

Ai đó có thể vui lòng giúp tôi thêm phần tử Địa chỉ IP vào mã JSON để mã hoạt động không?

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

Tôi bị mất với PHP và Chính sách Bản Tuyên Bố không nghĩ nó có thể là dễ dàng cho ai đó biết: http://tinyurl.com/9czr5lp

Nó mã hóa/ký một chút khác nhau cho một chính sách tùy chỉnh: http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html#private-content-custom-policy-statement

Dưới đây là ví dụ về AWS và các công trình ngoại trừ việc không khóa Địa chỉ IP.

Tôi có thể kiểm tra điều này rất nhanh nếu ai đó có thể vui lòng cho tôi một tay trong hai phút!

Cảm ơn ồ ạt cho bất kỳ sự giúp đỡ :)

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; 

Trả lời

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

Đây là một chuỗi JSON hợp lệ với giá trị đầy và trốn thoát. Nếu bạn chuyển địa chỉ IP dưới dạng biến, hãy đảm bảo bạn thoát khỏi /

ví dụ:

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

Hãy nhìn vào phần mở rộng json php Điều này sẽ làm cho mọi việc khá dễ dàng hơn:

dụ tuyên bố như php mảng

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

$json = json_encode($statement); 
+0

Làm thế nào chuyển đổi ip client sang định dạng CIDR ?? –

+0

Đây là một chút quá phức tạp để giải thích trong một bình luận. Thông thường bạn chỉ cho phép phạm vi 0-255 đầy đủ bằng cách cắt ngắn đoạn cuối cùng thành 0 và thêm mặt nạ bát phân/24. ví dụ: 10.0.0.1-10.0.0.255 sẽ là 10.0.0.0/24. Để biết thông tin chung về CIDR, hãy tham khảo http://en.m.wikipedia.org/wiki/Classless_Inter-Domain_Routing –

+0

Mọi chức năng php để chuyển đổi IP viz 114.235.149.30 sang định dạng CIDR ??? Hoặc tôi có thể chỉ sử dụng 1 ip duy nhất 114.235.149.30 trong khi ký url ?? –

Các vấn đề liên quan