cdn/sign_url.rb (30 lines of code) (raw):

# 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] def signed_url url:, key_name:, key:, expiration: # url = "URL of the endpoint served by Cloud CDN" # key_name = "Name of the signing key added to the Google Cloud Storage bucket or service" # key = "Signing key as urlsafe base64 encoded string" # expiration = Ruby Time object with expiration time require "base64" require "openssl" require "time" # Decode the URL safe base64 encode key decoded_key = Base64.urlsafe_decode64 key # Get UTC time in seconds expiration_utc = expiration.utc.to_i # Determine which separator makes sense given a URL separator = "?" separator = "&" if url.include? "?" # Concatenate url with expected query parameters Expires and KeyName url = "#{url}#{separator}Expires=#{expiration_utc}&KeyName=#{key_name}" # Sign the url using the key and url safe base64 encode the signature signature = OpenSSL::HMAC.digest "SHA1", decoded_key, url encoded_signature = Base64.urlsafe_encode64 signature # Concatenate the URL and encoded signature signed_url = "#{url}&Signature=#{encoded_signature}" end # [END cloudcdn_sign_url] if $PROGRAM_NAME == __FILE__ if ARGV.count == 4 puts signed_url url: ARGV.shift, key_name: ARGV.shift, key: ARGV.shift, expiration: Time.now + ARGV.shift.to_i else puts <<~USAGE Usage: bundle exec ruby sign_url.rb <url> <key_name> <key> <expires_in> Arguments: url - URL of the endpoint served by Cloud CDN key_name - Name of the signing key added to the Google Cloud Storage bucket or service key - Signing key as a urlsafe base64 encoded string expires_in - Expire signed URL in number of seconds from current time USAGE end end