Las solicitudes canónicas definen los elementos que debe incluir un usuario al enviar solicitudes autenticadas con la firma V4, como las URLs firmadas, a Cloud Storage.
Información general
Una solicitud canónica es una cadena que representa una solicitud HTTP específica a Cloud Storage. Utilizas una solicitud canónica junto con una clave criptográfica, como una clave RSA, para crear una firma que se incluye en la solicitud real como autenticación.
Una solicitud canónica incluye información como el verbo HTTP, los parámetros de la cadena de consulta y los encabezados que se espera que se usen en la solicitud real, así como el objeto, el contenedor u otro recurso que se va a solicitar.
Una solicitud canónica asegura que, cuando Cloud Storage recibe la solicitud, puede calcular la misma firma que has calculado tú. Si la versión y la versión calculada por Cloud Storage no coinciden, la solicitud falla.
Estructura
Las solicitudes canónicas tienen la siguiente estructura, que incluye el uso de saltos de línea entre cada elemento:
HTTP_VERB PATH_TO_RESOURCE CANONICAL_QUERY_STRING CANONICAL_HEADERS SIGNED_HEADERS PAYLOAD
Verbos HTTP
Las solicitudes firmadas pueden usar los siguientes verbos HTTP, que deben especificarse como parte de la solicitud canónica:
DELETE
GET
HEAD
POST
1PUT
1 Las URLs firmadas solo se pueden usar en solicitudes POST
que inicien una subida reanudable. Para obtener más información, consulta Usar URLs firmadas con subidas reanudables.
Ruta de recurso
Las solicitudes canónicas incluyen la ruta al recurso al que se aplica la solicitud. La ruta al recurso es todo lo que va después del nombre de host, pero antes de cualquier cadena de consulta.
Por ejemplo, si la URL de Cloud Storage es https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg
, la ruta al recurso es /example-bucket/cat-pics/tabby.jpeg
.
Si usas una URL alternativa de Cloud Storage, como
https://example-bucket.storage.googleapis.com/cat-pics/tabby.jpeg
la ruta al recurso es /cat-pics/tabby.jpeg
.
Para ver otros endpoints de URL que se pueden usar con URLs firmadas, consulta Endpoints de solicitudes de la API XML.
Al definir la ruta del recurso, debe codificar con porcentajes los siguientes caracteres reservados: ?=!#$&'()*+,:;@[]"
. También debe incluir en la ruta del recurso cualquier otra codificación con porcentajes que se use en la URL.
Cadena de consulta canónica
Las solicitudes canónicas especifican cada parámetro de cadena de consulta que se incluirá posteriormente en cualquier solicitud firmada que utilice la firma correspondiente, a excepción del parámetro de cadena de consulta X-Goog-Signature
o X-Amz-Signature
.
La cadena de consulta especificada en la solicitud canónica se denomina cadena de consulta canónica.
La cadena de consulta es todo lo que sigue al signo de interrogación (?
) al final de la ruta del recurso.
Por ejemplo, si la URL de Cloud Storage es https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg?generation=1360887697105000&userProject=my-project
, la cadena de consulta es generation=1360887697105000&userProject=my-project
.
Al crear la cadena de consulta canónica:
Los parámetros de la cadena de consulta deben ordenarse por nombre mediante un orden lexicográfico por valor de punto de código.
Cada parámetro de la cadena de consulta debe separarse con
&
.Si la cadena de consulta canónica está vacía, esta parte de la solicitud canónica general es solo una línea nueva (
\n
).
Parámetros de cadena de consulta obligatorios
La mayoría de los parámetros de cadena de consulta se añaden según sea necesario, pero los siguientes deben incluirse en la solicitud canónica si quieres usarla para crear una URL firmada:
X-Goog-Algorithm
: el algoritmo que usarás para firmar la URL. Los valores válidos sonGOOG4-RSA-SHA256
yGOOG4-HMAC-SHA256
.X-Goog-Credential
: las credenciales que usarás para firmar la URL. Las credenciales constan de un autorizador y un ámbito de credencial, que se indica con el siguiente formato:AUTHORIZER%2FCREDENTIAL_SCOPE
. El autorizador puede ser un nombre de cuenta de servicio o un ID de acceso de clave HMAC.X-Goog-Date
: fecha y hora en las que se puede usar la URL firmada, en el formato básico ISO 8601YYYYMMDD'T'HHMMSS'Z'
.X-Goog-Expires
: tiempo de validez de la URL firmada, medido en segundos a partir deX-Goog-Date
. El valor de caducidad más largo es de 604.800 segundos (7 días).X-Goog-SignedHeaders
: lista separada por punto y coma de los nombres de los encabezados definidos en la solicitud canónica. También se conocen como encabezados firmados.host
debe ser uno de los nombres de encabezado.
Estos parámetros de cadena de consulta deben usarse posteriormente en la URL firmada, junto con el parámetro de cadena de consulta X-Goog-Signature
, que contiene la firma que autentica la solicitud.
Encabezados canónicos
Las solicitudes canónicas incluyen los encabezados que deben incluirse posteriormente en las solicitudes firmadas que usen la firma correspondiente. Sin embargo, estas solicitudes firmadas pueden incluir encabezados adicionales que no se hayan especificado en la solicitud canónica, excepto los que se indican en Encabezados obligatorios. Los encabezados especificados en la solicitud canónica se denominan encabezados canónicos.
Los encabezados canónicos pueden incluir encabezados personalizados, así como encabezados de extensión
que empiezan por x-goog-
.
Cuando especifique encabezados canónicos, tenga en cuenta lo siguiente:
- Escribe todos los nombres de los encabezados en minúsculas.
- Ordena todos los encabezados por nombre de encabezado mediante una ordenación lexicográfica por valor de punto de código.
- Separe cada encabezado con un salto de línea (
\n
). - Elimina los nombres de encabezado duplicados creando un nombre de encabezado con una lista de valores separados por comas. Asegúrese de que no haya espacios en blanco entre los valores y de que el orden de la lista separada por comas coincida con el orden en el que aparecen los encabezados en su solicitud. Para obtener más información, consulta la sección 3.2 de RFC 7230.
- Cambia cualquier espacio en blanco o línea nueva plegable (CRLF o LF) por un espacio sencillo. Para obtener más información sobre el espacio en blanco de plegado, consulta la sección 3.2.4 de RFC 7230.
Elimina todos los espacios en blanco que rodeen los dos puntos que aparecen después del nombre del encabezado.
Por ejemplo, si usa el encabezado personalizado
x-goog-acl: private
sin quitar el espacio después de los dos puntos, se devuelve un error403 Forbidden
, porque la firma de la solicitud que calcula no coincide con la que calcula Cloud Storage.
Ejemplo
Si tienes el siguiente conjunto de encabezados:
host: storage.googleapis.com content-type: text/plain x-goog-meta-reviewer: jane x-goog-meta-reviewer: john
La creación de los encabezados canónicos en la solicitud canónica sería la siguiente:
content-type:text/plain host:storage.googleapis.com x-goog-meta-reviewer:jane,john
Encabezados canónicos obligatorios
La mayoría de los encabezados, como content-type
, se añaden según sea necesario, pero los siguientes encabezados siempre deben definirse en los encabezados canónicos si tienes intención de usarlos en la solicitud firmada:
host
: el URI que se usa para acceder a Cloud Storage.- Encabezados con el prefijo
x-goog-
. El único encabezado de este tipo que se puede incluir como encabezado canónico esx-goog-content-sha256
. - Encabezados con el prefijo
x-amz-
. El único encabezado de este tipo que se puede incluir como encabezado canónico esx-amz-content-sha256
.
Encabezados firmados
Un encabezado firmado es la parte del nombre de un encabezado canónico.
Para crear la lista de encabezados firmados, convierte todos los nombres de encabezado a minúsculas, ordénalos por código de carácter y usa un punto y coma (;
) para separar cada uno.
Ejemplo
Si tienes el siguiente conjunto de encabezados:
host: storage.googleapis.com content-type: text/plain x-goog-meta-reviewer: jane x-goog-meta-reviewer: john
La creación de los encabezados firmados en la solicitud canónica sería la siguiente:
content-type;host;x-goog-meta-reviewer
Carga útil
Si tu solicitud canónica se va a usar para crear una URL firmada, este valor debe ser la cadena
UNSIGNED-PAYLOAD
.Si tu solicitud canónica se va a usar para crear una firma que se utilizará en un encabezado
Authorization
:Usa
UNSIGNED-PAYLOAD
si quieres permitir cargas útiles arbitrarias como parte de la solicitud.Usa
UNSIGNED-PAYLOAD
si la solicitud va a iniciar una subida reanudable, ya que el encabezadox-goog-content-sha256
se ignora en las subidas reanudables.Si solo quiere permitir una carga útil específica, este valor debe ser un hash SHA-256 en hexadecimal y en minúsculas de la carga útil en cuestión. Para requerir una carga útil vacía, usa una cadena vacía como entrada de la función hash. Un ejemplo de una carga útil cifrada (en este caso, una carga útil vacía) es el siguiente:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Ejemplo
A continuación, se muestra un ejemplo de solicitud canónica con el formato correcto, donde los saltos de línea se muestran como saltos de línea reales y no como \n
:
GET /example-bucket/tabby.jpeg host:storage.googleapis.com x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20190301T190859Z host;x-amz-content-sha256;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Siguientes pasos
- Consulta información sobre las firmas y cómo usan las solicitudes canónicas.
- Crea una solicitud que use una solicitud canónica.
- Crea URLs firmadas, que usan solicitudes canónicas.
- Más información sobre las URLs firmadas