cdn/signUrl.php (20 lines of code) (raw):
<?php
/*
* Copyright 2018 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
# [START cloudcdn_sign_url]
/**
* Decodes base64url (RFC4648 Section 5) string
*
* @param string $input base64url encoded string
*
* @return string
*/
function base64url_decode($input)
{
$input .= str_repeat('=', (4 - strlen($input) % 4) % 4);
return base64_decode(strtr($input, '-_', '+/'), true);
}
/**
* Encodes a string with base64url (RFC4648 Section 5)
* Keeps the '=' padding by default.
*
* @param string $input String to be encoded
* @param bool $padding Keep the '=' padding
*
* @return string
*/
function base64url_encode($input, $padding = true)
{
$output = strtr(base64_encode($input), '+/', '-_');
return ($padding) ? $output : str_replace('=', '', $output);
}
/**
* Creates signed URL for Google Cloud CDN
* Details about order of operations: https://cloud.google.com/cdn/docs/using-signed-urls#creating_signed_urls
*
* Example function invocation (In production store the key safely with other secrets):
*
* <?php
* $base64UrlKey = 'wpLL7f4VB9RNe_WI0BBGmA=='; // head -c 16 /dev/urandom | base64 | tr +/ -_
* $signedUrl = sign_url('https://example.com/foo', 'my-key', $base64UrlKey, time() + 1800);
* echo $signedUrl;
* ?>
*
* @param string $url URL of the endpoint served by Cloud CDN
* @param string $keyName Name of the signing key added to the Google Cloud Storage bucket or service
* @param string $base64UrlKey Signing key as base64url (RFC4648 Section 5) encoded string
* @param int $expirationTime Expiration time as a UNIX timestamp (GMT, e.g. time())
*
* @return string
*/
function sign_url($url, $keyName, $base64UrlKey, $expirationTime)
{
// Decode the key
$decodedKey = base64url_decode($base64UrlKey);
// Determine which separator makes sense given a URL
$separator = (strpos($url, '?') === false) ? '?' : '&';
// Concatenate url with expected query parameters Expires and KeyName
$url = "{$url}{$separator}Expires={$expirationTime}&KeyName={$keyName}";
// Sign the url using the key and encode the signature using base64url
$signature = hash_hmac('sha1', $url, $decodedKey, true);
$encodedSignature = base64url_encode($signature);
// Concatenate the URL and encoded signature
return "{$url}&Signature={$encodedSignature}";
}
# [END cloudcdn_sign_url]