Sha256: 5b395343576443dff79f8662615a6887fec82f9a53a9b329a2ca980ed055955e

Contents?: true

Size: 1.2 KB

Versions: 3

Compression:

Stored size: 1.2 KB

Contents

module Touth
  module Authenticator

  module_function

    def issue_access_token(model, lifetime = Touth.access_token_lifetime)
      expires_at = Time.now.to_i + lifetime

      data = Marshal.dump([
        model.class,
        model.id,
        expires_at,
      ])

      data_sign = Touth.digest data
      data_key = gen_data_key model, data_sign

      [
        data_sign,
        data_key,
        data,
      ].join.unpack('H*')[0]
    end

    def valid_access_token?(token)
      !!get_model(token)
    end

    def get_model(token)
      @access_token_data_cache ||= {}
      model = @access_token_data_cache[token]

      return model if model

      begin
        data_sign, data_key, data = [token].pack('H*').unpack 'A32A32A*'

        if data_sign == Touth.digest(data)
          model_class, id, expires_at = Marshal.load data

          model = model_class.find id

          if gen_data_key(model, data_sign) == data_key && Time.now.to_i < expires_at
            @access_token_data_cache[token] = model
          end
        end
      rescue
        nil
      end
    end

    def gen_data_key(model, data_sign)
      Touth.digest [data_sign, model.send(Touth.password_field)].join
    end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
touth-1.1.2 lib/touth/authenticator.rb
touth-1.1.1 lib/touth/authenticator.rb
touth-1.1.0 lib/touth/authenticator.rb