- 08/05/2020
- 12:44 pm
- marcofbb
Dejo un código para firmar URL para google storage con el lenguaje de programación PHP
<?php
/*
DOCS:
https://cloud.google.com/storage/docs/access-control/signed-urls
https://cloud.google.com/storage/docs/access-control/signing-urls-manually
Translate to PHP of code Python: https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/storage/signed_urls/generate_signed_urls.py
*/
function generate_signed_url_google($service_account_file, $bucket_name, $object_name, $subresource = null, $expiration=604800, $http_method='GET', $query_parameters = array(), $headers = array()){
date_default_timezone_set('UTC');
if($expiration > 604800){
echo 'Expiration Time can\'t be longer than 604800 seconds (7 days).';
return;
}
$google_credentials = json_decode(file_get_contents($service_account_file), true);
if(empty($google_credentials)){
echo 'Error credentials.';
return;
}
$escaped_object_name = implode('/', array_map('rawurlencode', explode('/', $object_name)));
$canonical_uri = '/'.$escaped_object_name;
$datetime_now = time();
$request_timestamp = date('Ymd\THis\Z', $datetime_now);
$datestamp = date('Ymd', $datetime_now);
$client_email = $google_credentials['client_email'];
$credential_scope = $datestamp.'/auto/storage/goog4_request';
$credential = $client_email.'/'.$credential_scope;
$host = $bucket_name.'.storage.googleapis.com';
$headers['host'] = $bucket_name.'.storage.googleapis.com';
$canonical_headers = '';
$signed_headers = '';
$ordered_headers = $headers;
ksort($ordered_headers, SORT_STRING);
foreach($ordered_headers as $key => $value){
$key = strtolower($key);
$value = ($value);
$canonical_headers .= $key.':'.$value."\n";
$signed_headers .= $key.';';
}
$signed_headers = substr($signed_headers, 0, -1);
$query_parameters['X-Goog-Algorithm'] = 'GOOG4-RSA-SHA256';
$query_parameters['X-Goog-Credential'] = $credential;
$query_parameters['X-Goog-Date'] = $request_timestamp;
$query_parameters['X-Goog-Expires'] = $expiration;
$query_parameters['X-Goog-SignedHeaders'] = $signed_headers;
if(!empty($subresource)){
$query_parameters[$subresource] = '';
}
$canonical_query_string = '';
$ordered_query_parameters = $query_parameters;
ksort($ordered_query_parameters, SORT_STRING);
foreach($ordered_query_parameters as $key => $value){
$key = rawurlencode($key);
$value = rawurlencode($value);
$canonical_query_string .= $key.'='.$value.'&';
}
$canonical_query_string = substr($canonical_query_string, 0, -1);
$canonical_request = implode("\n",array($http_method, $canonical_uri, $canonical_query_string, $canonical_headers, $signed_headers, 'UNSIGNED-PAYLOAD'));
$canonical_request_hash = hash('sha256', utf8_encode($canonical_request));
$string_to_sign = implode("\n",array('GOOG4-RSA-SHA256', $request_timestamp, $credential_scope, $canonical_request_hash));
$pkeyid = $google_credentials['private_key'];
if(!openssl_sign($string_to_sign,$signature,$pkeyid,'sha256')) {
$signature = 'none';
} else {
$signature = bin2hex($signature);
}
$scheme_and_host = 'https://'.$host;
$signed_url = $scheme_and_host.$canonical_uri.'?'.$canonical_query_string.'&x-goog-signature='.$signature;
return $signed_url;
} |
<?php
/*
DOCS:
https://cloud.google.com/storage/docs/access-control/signed-urls
https://cloud.google.com/storage/docs/access-control/signing-urls-manually
Translate to PHP of code Python: https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/storage/signed_urls/generate_signed_urls.py
*/
function generate_signed_url_google($service_account_file, $bucket_name, $object_name, $subresource = null, $expiration=604800, $http_method='GET', $query_parameters = array(), $headers = array()){
date_default_timezone_set('UTC');
if($expiration > 604800){
echo 'Expiration Time can\'t be longer than 604800 seconds (7 days).';
return;
}
$google_credentials = json_decode(file_get_contents($service_account_file), true);
if(empty($google_credentials)){
echo 'Error credentials.';
return;
}
$escaped_object_name = implode('/', array_map('rawurlencode', explode('/', $object_name)));
$canonical_uri = '/'.$escaped_object_name;
$datetime_now = time();
$request_timestamp = date('Ymd\THis\Z', $datetime_now);
$datestamp = date('Ymd', $datetime_now);
$client_email = $google_credentials['client_email'];
$credential_scope = $datestamp.'/auto/storage/goog4_request';
$credential = $client_email.'/'.$credential_scope;
$host = $bucket_name.'.storage.googleapis.com';
$headers['host'] = $bucket_name.'.storage.googleapis.com';
$canonical_headers = '';
$signed_headers = '';
$ordered_headers = $headers;
ksort($ordered_headers, SORT_STRING);
foreach($ordered_headers as $key => $value){
$key = strtolower($key);
$value = ($value);
$canonical_headers .= $key.':'.$value."\n";
$signed_headers .= $key.';';
}
$signed_headers = substr($signed_headers, 0, -1);
$query_parameters['X-Goog-Algorithm'] = 'GOOG4-RSA-SHA256';
$query_parameters['X-Goog-Credential'] = $credential;
$query_parameters['X-Goog-Date'] = $request_timestamp;
$query_parameters['X-Goog-Expires'] = $expiration;
$query_parameters['X-Goog-SignedHeaders'] = $signed_headers;
if(!empty($subresource)){
$query_parameters[$subresource] = '';
}
$canonical_query_string = '';
$ordered_query_parameters = $query_parameters;
ksort($ordered_query_parameters, SORT_STRING);
foreach($ordered_query_parameters as $key => $value){
$key = rawurlencode($key);
$value = rawurlencode($value);
$canonical_query_string .= $key.'='.$value.'&';
}
$canonical_query_string = substr($canonical_query_string, 0, -1);
$canonical_request = implode("\n",array($http_method, $canonical_uri, $canonical_query_string, $canonical_headers, $signed_headers, 'UNSIGNED-PAYLOAD'));
$canonical_request_hash = hash('sha256', utf8_encode($canonical_request));
$string_to_sign = implode("\n",array('GOOG4-RSA-SHA256', $request_timestamp, $credential_scope, $canonical_request_hash));
$pkeyid = $google_credentials['private_key'];
if(!openssl_sign($string_to_sign,$signature,$pkeyid,'sha256')) {
$signature = 'none';
} else {
$signature = bin2hex($signature);
}
$scheme_and_host = 'https://'.$host;
$signed_url = $scheme_and_host.$canonical_uri.'?'.$canonical_query_string.'&x-goog-signature='.$signature;
return $signed_url;
}
Gist: https://gist.github.com/marcofbb/97c875bb51f2dc9740588f8e550aac77
- 01/07/2013
- 12:30 am
- marcofbb

El gigante de internet “Google” estará desarrollando su propia consola de videojuegos, junto a un reloj inteligente, ambos utilizando su sistema operativo Android. Según reveló Wall Street Journal.
Continuar leyendo..
- 14/05/2013
- 8:38 pm
- marcofbb
Google anteriormente daba por ejemplo 9GB para el servicio de mails, Gmail, y 5GB para el servicio de almacenamiento en la nube, Google Drive. A partir de ahora, ya no es mas así y unifica todo en un total de 15GB por cuenta.

- 04/11/2012
- 3:01 pm
- marcofbb
Las imágenes de fondo personalizadas de Google, serán eliminadas a partir del 16 de noviembre, ami personalmente no me molesta ya que nunca las utilice, y tampoco amigos y familiares. Pero hay una minoría que las utilizaba para darle su estilo al buscador más popular de internet, ellos si fueron afectados.
La excusa que ponen de parte de Google para eliminar esta función, es que están modernizando la portada de búsqueda del buscador. Si es para mejor, bienvenido sea.
¿Ustedes personalizan su portada del buscador?
- 23/05/2012
- 8:06 pm
- marcofbb
Chrome, el explorador de Google, se ha posicionado número uno en la lucha con otros exploradores. Se ha posicionado muy bien por algunas cualidades que tiene como actualización en segundo plano, trabaja perfectamente con las nuevas tecnologias (HTML5 y CSS3) y es un explorador muy liviano. Una imagen mas de mil palabras.
¿Ustedes que explorador usan?
- 06/01/2012
- 11:43 am
- marcofbb
De momento no hay nada confirmado pero un grupo de grandes empresas de internet a nivel mundial estan organizando un apagon total de sus servicios para el proximo dia 23 de Enero, justo un día antes de que el senado de los EEUU trate la ley SOPA (Stop Online Piracy Act).
Algunas de las empresas serian Google, LinkedIn, Facebook, Twitter, Mozilla, Wikimedia Foundation, eBay, AOL, Etsy, IAC, Foursquare, OpenDNS, PayPal, Yahoo y Zynga. Con lo cual prácticamente seria un día sin internet.
Via: CodigoGeek
- 23/11/2011
- 2:57 am
- marcofbb
Las chrome son netbooks con el sistema operativo de Chrome. Este sistema operativo trae como novedoso que es todo online, es decir, que si no tenes wifi / 3G esta netbook no se podrá usar de manera portátil y quería inservible. El precio
Las aplicaciones, los documentos y los parámetros almacenados en su memoria flash de 16 GB quedan también grabados en línea, en el “Cloud”. Nada mejor para acceder en cualquier momento a partir de otro Chromebook, incluso si pierdes el tuyo. Continuar leyendo..
- 11/11/2011
- 1:39 am
- marcofbb

Google sigue trabajando para tener en todos lados su botón +1 y de alguna forma indirecta dar mas popularidad a su red-social y así poder ganar terreno. Es por eso que ahora al realizar una búsqueda en Google Imágenes, y situar el ratón por arriba de la imagen va a aparecer el botón Google +1.
- 05/11/2011
- 4:56 pm
- marcofbb
La nueva ocurrencia del gigante informático Google es escribir un comando de palabras en la barra del buscador y hacer girar inesperadamente la pantalla, esto no es tan importante como los cambios que hicieron ayer, pero de todas formas entre tanto trabajo se hicieron tiempo para hacer este jueguito.
El nuevo truco de Google también funciona si escribimos “Z or R twice“.
Algo para tener en cuenta es que el truco sólo se puede hace con los exploradores Firefox, Chrome y Safari. Sin embargo, no funciona en Explorer.
- 27/09/2011
- 12:20 am
- marcofbb
El día de hoy Google cumple 13 años y lo festeja cambiando su logo por el de una torta.
La noticia es corta, porque creo que todos conocemos a Google, año tras año fue mejorando y adquiriendo nuevos servicios la mayoría de ellos gratuitos. Es uno de los grandes hoy en día en todo el mundo.