URL prefirmada de Amazon S3 con la versión 3 de AWS SDK para PHP
Puede autenticar determinados tipos de solicitudes pasando la información requerida como parámetros de una cadena de consulta, en lugar de usar el encabezado de autorización HTTP. Esto resulta útil para permitir el acceso directo de navegadores de terceros a sus datos de Amazon S3 privados, sin enviar la solicitud por proxy. La idea es construir una solicitud “prefirmada” y codificarla como una URL que pueda utilizar otro usuario. Además, puede limitar una solicitud prefirmada especificando una fecha de vencimiento.
Creación de una URL prefirmada para una solicitud GET de HTTP
En el siguiente ejemplo de código se muestra cómo crear una URL prefirmada para una solicitud GET de HTTP mediante el SDK para PHP.
<?php require 'vendor/autoload.php'; use Aws\S3\S3Client; $s3Client = new S3Client([ 'region' => 'us-west-2', ]); // Supply a CommandInterface object and an expires parameter to the `createPresignedRequest` method. $request = $s3Client->createPresignedRequest( $s3Client->getCommand('GetObject', [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'demo-key', ]), '+1 hour' ); // From the resulting RequestInterface object, you can get the URL. $presignedUrl = (string) $request->getUri(); echo $presignedUrl;
En la referencia de la API para el método createPresignedRequest se proporcionan más detalles.
Otra persona puede utilizar el valor $presignedUrl para recuperar el objeto en la próxima hora. Cuando se realiza la solicitud GET de HTTP (por ejemplo, mediante un navegador), el servicio S3 considera que la llamada proviene del usuario que ha creado la URL prefirmada.
Creación de una URL prefirmada para una solicitud PUT de HTTP
En el siguiente ejemplo de código se muestra cómo crear una URL prefirmada para una solicitud PUT de HTTP mediante el SDK para PHP.
<?php require 'vendor/autoload.php'; use Aws\S3\S3Client; $s3Client = new S3Client([ 'region' => 'us-west-2', ]); $request = $s3Client->createPresignedRequest( $s3Client->getCommand('PutObject', [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'demo-key', ]), '+1 hour' ); // From the resulting RequestInterface object, you can get the URL. $presignedUrl = (string) $request->getUri();
Otro usuario ahora puede utilizar la URL prefirmada en una solicitud PUT de HTTP para cargar un archivo:
use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Response; // ... function uploadWithPresignedUrl($presignedUrl, $filePath, $s3Client): ?Response { // Get the HTTP handler from the S3 client. $handler = $s3Client->getHandlerList()->resolve(); // Create a stream from the file. $fileStream = new Stream(fopen($filePath, 'r')); // Create the request. $request = new Request( 'PUT', $presignedUrl, [ 'Content-Type' => mime_content_type($filePath), 'Content-Length' => filesize($filePath) ], $fileStream ); // Send the request using the handler. try { $promise = $handler($request, []); $response = $promise->wait(); return $response; } catch (Exception $e) { echo "Error uploading file: " . $e->getMessage() . "\n"; return null; } }