You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.0 KiB

4 years ago
# encoding: utf-8
4 years ago
require 'base64'
require 'uri'
require 'openssl'
module Carto
class UrlSigner
def initialize(private_key)
@private_key = private_key
end
def base64_decode(base64_string)
return Base64.strict_decode64(base64_string.tr('-_','+/'))
end
def base64_encode(raw)
return Base64.strict_encode64(raw).tr('+/','-_')
end
def sign_url(url)
parsed_url = URI.parse(url)
url_to_sign = parsed_url.path + '?' + parsed_url.query
# Decode the private key
raw_key = base64_decode(@private_key)
# create a signature using the private key and the URL
digest = ::OpenSSL::Digest.new('sha1')
raw_signature = OpenSSL::HMAC.digest(digest, raw_key, url_to_sign)
# encode the signature into base64 for url use form.
signature = base64_encode(raw_signature)
# prepend the server and append the signature.
signedUrl = parsed_url.scheme+"://"+ parsed_url.host + url_to_sign + "&signature=#{signature}"
return signedUrl
end
end
end