PresignProvider V4
a phpmae:Class in Amazon Web Services Integration
Provides the capability to generate Presigned URLs for Amazon Webservices APIs using the signature version 4.
Public PHP Methods
-
get($url, $region = 'us-east-1', $expiry = 3600)Sign a URL for a GET request.
-
put($url, $region = 'us-east-1', $expiry = 3600)Sign a URL for a PUT request.
-
post($url, $region = 'us-east-1', $expiry = 3600)Sign a URL for a POST request.
Source Code
<?php
use ML\IRI\IRI;
use CloudObjects\PhpMAE\ConfigLoader;
/**
* Implementation for coid://aws.3rd-party.co/PresignProvider/V4
*/
class PresignProvider {
private $awsAccessKeyId;
private $awsSecretAccessKey;
public function __construct(ConfigLoader $config) {
$priorities = [ 'callerClass', 'callerClass.namespace' ];
$this->awsAccessKeyId = $config->get('coid://aws.3rd-party.co/accessKeyId', $priorities);
$this->awsSecretAccessKey = $config->get('coid://aws.3rd-party.co/secretAccessKey', $priorities);
if (!isset($this->awsAccessKeyId) || !isset($this->awsSecretAccessKey))
throw new \Exception("AWS credentials required.");
}
private function sign($method, $url, $expiry = 3600, $service = 's3', $region = 'us-east-1') {
$url = new IRI($url);
$date = new \DateTime('UTC');
$scope = $date->format('Ymd').'/'.$region.'/'.$service.'/aws4_request';
$query = http_build_query([
'X-Amz-Algorithm' => 'AWS4-HMAC-SHA256',
'X-Amz-Credential' => $this->awsAccessKeyId.'/'.$scope,
'X-Amz-Date' => $date->format('Ymd\THis\Z'),
'X-Amz-Expires' => (int)$expiry,
'X-Amz-SignedHeaders' => 'host'
]);
// Prepare canonical request
$canonicalRequest = [
$method,
str_replace('%2F','/', rawurlencode($url->getPath())),
($url->getQuery()!='' ? $url->getQuery().'&' : '').$query,
'host:'.$url->getHost()
];
$canonicalRequest[] = '';
$canonicalRequest[] = 'host';
$canonicalRequest[] = 'UNSIGNED-PAYLOAD';
// Create string to sign
$string = implode("\n", [
'AWS4-HMAC-SHA256',
$date->format('Ymd\THis\Z'),
$scope,
hash('SHA256', implode("\n", $canonicalRequest))
]);
// Create signature
$kSecret = 'AWS4'.$this->awsSecretAccessKey;
$kDate = hash_hmac('SHA256', $date->format('Ymd'), $kSecret, true);
$kRegion = hash_hmac('SHA256', $region, $kDate, true);
$kService = hash_hmac('SHA256', 's3', $kRegion, true);
$kSigning = hash_hmac('SHA256', 'aws4_request', $kService, true);
$signature = hash_hmac('SHA256', $string, $kSigning);
return (string)$url.($url->getQuery()=='' ? '?' : '&')
.$query.'&X-Amz-Signature='.$signature;
}
/**
* Sign a URL for a GET request.
*/
public function get($url, $region = 'us-east-1', $expiry = 3600) {
return $this->sign('GET', $url, $expiry, 's3', $region);
}
/**
* Sign a URL for a PUT request.
*/
public function put($url, $region = 'us-east-1', $expiry = 3600) {
return $this->sign('PUT', $url, $expiry, 's3', $region);
}
/**
* Sign a URL for a POST request.
*/
public function post($url, $region = 'us-east-1', $expiry = 3600) {
return $this->sign('POST', $url, $expiry, 's3', $region);
}
}
Meta
- URI / COID
- coid://aws.3rd-party.co/PresignProvider/V4 content_copy
- Revision
- 3-bc30c5dbf60160b4a5ef8b99ff2eb2bb content_copy
- Short ID
- aws:PresignProvider/V4 content_copy
- Reference URL
- https://coid.link/aws.3rd-party.co/PresignProvider/V4 content_copy
- Last updated
- 2021-04-22 11:26 (UTC)
- Created at
- 2021-04-22 11:26 (UTC)