Class: HaveAPI::Authentication::Token::Provider

Inherits:
Base
  • Object
show all
Defined in:
lib/haveapi/authentication/token/provider.rb

Overview

Provider for token authentication. This class has to be subclassed and implemented.

Token auth contains resource token. User can request a token by calling action Resources::Token::Request. Returned token is then used for authenticating the user. Client sends the token with each request in configured #http_header or #query_parameter.

Token can be revoked by calling Resources::Token::Revoke.

Example usage:

Token model: class ApiToken < ActiveRecord::Base belongs_to :user

validates :user_id, :token, presence: true
validates :token, length: {is: 100}

enum lifetime: %i(fixed renewable_manual renewable_auto permanent)

def renew
  self.valid_to = Time.now + interval
end
end

Authentication provider: class MyTokenAuth < HaveAPI::Authentication::Token::Provider protected def save_token(request, user, token, lifetime, interval) user.tokens << ::Token.new(token: token, lifetime: lifetime, valid_to: (lifetime != 'permanent' ? Time.now + interval : nil), interval: interval, label: request.user_agent) end

def revoke_token(request, user, token)
  user.tokens.delete(token: token)
end

def renew_token(request, user, token)
  t = ::Token.find_by(user: user, token: token)

  if t.lifetime.start_with('renewable')
    t.renew
    t.save
    t.valid_to
  end
end

def find_user_by_credentials(request, username, password)
  ::User.find_by(login: username, password: password)
end

def find_user_by_token(request, token)
  t = ::Token.find_by(token: token)

  if t
    # Renew the token if needed
    if t.lifetime == 'renewable_auto'
      t.renew
      t.save
    end

    t.user # return the user
  end
end
end

Finally put the provider in the authentication chain: api = HaveAPI.new(...) ... api.auth_chain << MyTokenAuth

Instance Attribute Summary

Attributes inherited from Base

#name, #resources

Instance Method Summary collapse

Methods inherited from Base

#initialize

Constructor Details

This class inherits a constructor from HaveAPI::Authentication::Base

Instance Method Details

#authenticate(request) ⇒ Object



89
90
91
92
93
# File 'lib/haveapi/authentication/token/provider.rb', line 89

def authenticate(request)
  t = token(request)

  t && find_user_by_token(request, t)
end

#describeObject



99
100
101
102
103
104
# File 'lib/haveapi/authentication/token/provider.rb', line 99

def describe
  {
      http_header: http_header,
      query_parameter: query_parameter,
  }
end

#setupObject



82
83
84
85
86
87
# File 'lib/haveapi/authentication/token/provider.rb', line 82

def setup
  Resources::Token.token_instance ||= {}
  Resources::Token.token_instance[@version] = self

  @server.allow_header(http_header)
end

#token(request) ⇒ Object



95
96
97
# File 'lib/haveapi/authentication/token/provider.rb', line 95

def token(request)
  request[query_parameter] || request.env[header_to_env]
end