class HmacSignature::Request

Constants

ISO8601

www.w3.org/TR/NOTE-datetime

VALID_METHODS

Attributes

credentials[R]
method[R]
params[R]
path[R]

Public Class Methods

new(method, path, params, credentials=nil) click to toggle source
# File lib/hmac_signature/request.rb, line 10
def initialize method, path, params, credentials=nil
        raise ArgumentError, "Expected string" unless method.is_a?(String) && !method.empty?
        raise ArgumentError, "Expected string" unless path.is_a?(String) && !path.empty?
        raise ArgumentError, "Expected hash" unless params.is_a?(Hash)
        raise ArgumentError, "Expected credentials" unless credentials.nil? || credentials.is_a?(HmacSignature::Credentials)

        @method = method
        @path = path
        @params = params
        @credentials = credentials
end

Public Instance Methods

authenticate() { |key| ... } click to toggle source
# File lib/hmac_signature/request.rb, line 32
def authenticate
        raise ArgumentError, "Block required" unless block_given?
        raise AuthenticationError, "Missing parameter: auth_key" unless credentials.key
        token = yield credentials.key
        unless token
                raise AuthenticationError, "Unknown key"
        end
        authenticate_by_token! token
        return token
end
authenticate_by_token(token) click to toggle source
# File lib/hmac_signature/request.rb, line 43
def authenticate_by_token token
        authenticate_by_token! token
rescue
        false
end
authenticate_by_token!(token) click to toggle source
# File lib/hmac_signature/request.rb, line 49
def authenticate_by_token! token
        raise HmacSignature::AuthenticationError, "Credentials required" unless credentials

        if token.secret.nil? || token.secret.empty?
                raise ArgumentError, "Provided token is missing secret"
        end

        # authenticates version
        raise HmacSignature::AuthenticationError, "Version required" unless credentials.version
raise HmacSignature::AuthenticationError, "Version not supported" unless credentials.version == '1.0'

        # authenticates expiry
        raise HmacSignature::AuthenticationError, "Expiration timestamp required" unless credentials.expiry
        if Time.now.utc.to_i > credentials.expiry.to_i
                raise HmacSignature::AuthenticationError, "Timestamp expired: Given timestamp "\
                "(#{Time.at(credentials.expiry.to_i).utc.strftime(ISO8601)}) "\
                "has expired. The current server time is "\
                "(#{Time.now.utc.strftime(ISO8601)})"
        end

        # authenticates signature
        valid_signature = generate_signature(token, credentials.expiry, credentials.version)
        unless credentials.signature == valid_signature.to_s
                raise HmacSignature::AuthenticationError, "Invalid signature: you should have "\
                "sent HmacSHA256Hex(#{valid_signature.string_to_sign.inspect}, your_secret_key)"\
                ", but you sent #{credentials.signature.inspect}"
        end
        
        true
end
sign(token, expires_in=600) click to toggle source
# File lib/hmac_signature/request.rb, line 22
def sign token, expires_in=600
        expires_at   = (Time.now.utc.to_i + expires_in).to_s
        version      = Signature::VERSION
        key          = token.key
        secret               = token.secret
        signature    = generate_signature(token, expires_at, version).to_s

        HmacSignature::Credentials.new(key, expires_at, version, signature)
end

Private Instance Methods

generate_signature(token, timestamp, version) click to toggle source
# File lib/hmac_signature/request.rb, line 82
def generate_signature token, timestamp, version
        HmacSignature::Signature.new(method, path, params, timestamp, version, token.key, token.secret)
end