$host, 'user-agent' => $userAgent, ]; if (!is_null($accessToken)) { $canonicalHeaders['x-amz-access-token'] = $accessToken; } $canonicalHeaders['x-amz-date'] = $amzdate; if (!is_null($securityToken)) { $canonicalHeaders['x-amz-security-token'] = $securityToken; } $canonicalHeadersStr = ''; foreach($canonicalHeaders as $h => $v) { $canonicalHeadersStr .= $h . ':' . $v . "\n"; } $signedHeadersStr = join(';' , array_keys($canonicalHeaders)); //Prepare credentials scope $credentialScope = $date . '/' . $region . '/' . $service . '/' . $terminationString; //prepare canonical request $canonicalRequest = $method . "\n" . $uri . "\n" . $queryString . "\n" . $canonicalHeadersStr . "\n" . $signedHeadersStr . "\n" . $hashedPayload; //Prepare the signature payload $stringToSign = $algorithm . "\n" . $amzdate . "\n" . $credentialScope . "\n" . hash('sha256', $canonicalRequest); //Prepare lockers $kSecret = "AWS4" . $secretKey; $kDate = hash_hmac('sha256', $date, $kSecret, true); $kRegion = hash_hmac('sha256', $region, $kDate, true); $kService = hash_hmac('sha256', $service, $kRegion, true); $kSigning = hash_hmac('sha256', $terminationString, $kService, true); //Compute the signature $signature = trim(hash_hmac('sha256', $stringToSign, $kSigning)); // Without fourth parameter passed as true, returns lowercase hexits as called for by docs $authorizationHeader = $algorithm . " Credential={$accessKey}/{$credentialScope}, SignedHeaders={$signedHeadersStr}, Signature={$signature}"; $headers = array_merge($canonicalHeaders, [ "Authorization" => $authorizationHeader, ]); $request['headers'] = array_merge($request['headers'], $headers); return $request; } }