46 lines
1.0 KiB
Ruby
46 lines
1.0 KiB
Ruby
# encoding: utf-8
|
|
|
|
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
|