2016-06-14 3 views
2

gcloud 저장소로 작업 할 수있는 서명 된 URL을 얻을 수 없습니다.gcloud 저장소로 작업하기위한 서명 된 URL을 얻을 수 없습니다.

여기에 누락 된 것이 있지만 쉽게 찾을 수없는 것이 있습니다.

여기에 방향을 따르는 gcloud 양동이 파일에 서명 URL을 만들려고 https://cloud.google.com/storage/docs/access-control/create-signed-urls-program

는 죽을 계정을 생성하고 pk12을 다운로드하고 키를 얻기 위해 PEM하는 P12 변환. 여기

코드입니다 :

$pkeyid = "-----BEGIN RSA PRIVATE KEY----- 
[removed actual key] 
-----END RSA PRIVATE KEY-----"; 
$secret = "notasecret"; 
$expires = time()+86400; 
$http_method = "GET"; 
$bucketName = "mybucketname"; 
$stringtosign = "GET\n 
\n 
text/plain\n 
".$expires."\n 
\n 
\n 
\n 
".$bucketName ."/mymediafile.mp4"; 

openssl_sign($stringtosign, $signature, $pkeyid); 
$emailid="[email protected][project].iam.gserviceaccount.com";  
$signature = urlencode(base64_encode($signature)); 
$gcloudloc = "https://storage.googleapis.com/".$bucketName ."/mymediafile.mp4?GoogleAccessId=".$emailid."&Expires=".$expires."&Signature=".$signature; 

나는 유효한 signiture 모양을 얻을 수 있지만 전체 URL을 사용하려고 할 때 나는 두 가지 문제했다

The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method. 

답변

0

수 :

  1. 개인 키에 붙여 넣기.
  2. openssl_sign의 일부 매개 변수가 누락되었습니다.
  3. 또한 $ stringtosign이 엉망인 것 같습니다. 모든 한 줄로 변경하면 해당 부분이 고정됩니다.

"Google Cloud Storage Signed Url for media"이 (가) hdezela의 기능을 사용하여 작동하도록했습니다.

function storageURL($bucket,$archivo) { 
    $expires = time()+60; 
    $to_sign = ("GET\n\n\n".$expires."\n/".$bucket.'/'.$archivo); 
    $fp = fopen('/path/to/google.pem', 'r'); 
    $priv_key = fread($fp, 8192); 
    fclose($fp); 
    $pkeyid = openssl_get_privatekey($priv_key); 
    if(!openssl_sign($to_sign,$signature,$pkeyid,'sha256')) { 
     $signature = 'sinfirma'; 
    } else { 
     $signature = urlencode(base64_encode($signature)); 
    } 
    return ('https://'.$bucket.'.storage.googleapis.com/'.$archivo.'[email protected]&Expires='.$expires.'&Signature='.$signature); 
} 

나는 원래 그것이 URL 일 줄 알았지 만 이것은 잘 작동합니다.

"https://storage.googleapis.com/".$bucketName ."/ 
관련 문제