Module: Userbin

Defined in:
lib/userbin/events.rb,
lib/userbin/current.rb,
lib/userbin/railtie.rb,
lib/userbin/session.rb,
lib/userbin/userbin.rb,
lib/userbin/version.rb,
lib/userbin/basic_auth.rb,
lib/userbin/configuration.rb,
lib/userbin/authentication.rb,
lib/userbin/rails/auth_helpers.rb,
lib/userbin.rb

Defined Under Namespace

Modules: AuthHelpers Classes: Authentication, BasicAuth, Callback, Configuration, Current, Error, Event, Events, Model, ParseSignedJSON, Railtie, SecurityError, Session, User, VerifySignature

Constant Summary collapse

VERSION =
"0.2.4"

Class Method Summary collapse

Class Method Details

.authenticate!(request, now = Time.now) ⇒ Object

Provide either a Rack::Request or a Hash containing :signature and :data.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/userbin/userbin.rb', line 13

def self.authenticate!(request, now = Time.now)
  signature, data =
    request.cookies.values_at('_ubs', '_ubd')

  if signature && data && valid_signature?(signature, data)

    current = Userbin::Session.new(MultiJson.decode(data))

    if current.authenticated?
      if now > Time.at(current.expires_at / 1000)
        signature, data = refresh_session(current.id)
      end
    end
  end

  tmp = MultiJson.decode(data) if data

  self.current = Userbin::Session.new(tmp)

  [signature, data]
end

.authenticate_events!(request, now = Time.now) ⇒ Object



2
3
4
5
6
7
8
9
# File 'lib/userbin/userbin.rb', line 2

def self.authenticate_events!(request, now = Time.now)
  signature, data =
    request.params.values_at('signature', 'data')

  valid_signature?(signature, data)

  [signature, data]
end

.authenticated?Boolean



52
53
54
# File 'lib/userbin/userbin.rb', line 52

def self.authenticated?
  current.authenticated? rescue false
end

.configObject



44
45
46
# File 'lib/userbin.rb', line 44

def config
  @configuration ||= Userbin::Configuration.new
end

.configure(config_hash = nil) {|config| ... } ⇒ Object

Yields:



34
35
36
37
38
39
40
41
42
# File 'lib/userbin.rb', line 34

def configure(config_hash=nil)
  if config_hash
    config_hash.each do |k,v|
      config.send("#{k}=", v)
    end
  end

  yield(config) if block_given?
end

.currentObject



44
45
46
# File 'lib/userbin/userbin.rb', line 44

def self.current
  Thread.current[:userbin]
end

.current=(value) ⇒ Object



48
49
50
# File 'lib/userbin/userbin.rb', line 48

def self.current=(value)
  Thread.current[:userbin] = value
end

.current_userObject



56
57
58
# File 'lib/userbin/userbin.rb', line 56

def self.current_user
  current.user if current
end

.refresh_session(session_id) ⇒ Object



35
36
37
38
39
40
41
42
# File 'lib/userbin/userbin.rb', line 35

def self.refresh_session(session_id)
  api_endpoint = ENV["USERBIN_API_ENDPOINT"] || 'https://api.userbin.com'
  uri = URI("#{api_endpoint}/sessions/#{session_id}/refresh")
  uri.user = config.app_id
  uri.password = config.api_secret
  net = Net::HTTP.post_form(uri, {})
  [net['X-Userbin-Signature'], net.body]
end

.userObject



60
61
62
# File 'lib/userbin/userbin.rb', line 60

def self.user
  current_user
end

.valid_signature?(signature, data) ⇒ Boolean

Checks signature against secret and returns boolean

Raises:



68
69
70
71
72
73
# File 'lib/userbin/userbin.rb', line 68

def self.valid_signature?(signature, data)
  digest = OpenSSL::Digest::SHA256.new
  valid = signature == OpenSSL::HMAC.hexdigest(digest, config.api_secret, data)
  raise SecurityError, "Invalid signature" unless valid
  valid
end