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, UnimplementedError, User, VerifySignature

Constant Summary collapse

VERSION =
"0.3.4"

Class Method Summary collapse

Class Method Details

._current_userObject



62
63
64
# File 'lib/userbin/userbin.rb', line 62

def self._current_user
  current.user if current
end

.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
# 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 now > Time.at(current.expires_at / 1000)
      signature, data = refresh_session(current.id)
    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

Returns:

  • (Boolean)


50
51
52
# File 'lib/userbin/userbin.rb', line 50

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

.configObject



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

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

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

Yields:



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

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



42
43
44
# File 'lib/userbin/userbin.rb', line 42

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

.current=(value) ⇒ Object



46
47
48
# File 'lib/userbin/userbin.rb', line 46

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

.current_userObject



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/userbin/userbin.rb', line 66

def self.current_user
  if Userbin.config.find_user
    u = Userbin.config.find_user.call(_current_user.id)
    return u if u
    if Userbin.config.create_user
      u = Userbin.config.create_user.call(_current_user)
      return u if u
      _current_user
    else
      raise UnimplementedError, "You need to implement create_user"
    end
  else
    _current_user
  end
end

.refresh_session(session_id) ⇒ Object



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

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



82
83
84
# File 'lib/userbin/userbin.rb', line 82

def self.user
  current_user
end

.user_logged_in?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/userbin/userbin.rb', line 54

def self.user_logged_in?
  authenticated?
end

.user_signed_in?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/userbin/userbin.rb', line 58

def self.user_signed_in?
  authenticated?
end

.valid_signature?(signature, data) ⇒ Boolean

Checks signature against secret and returns boolean

Returns:

  • (Boolean)

Raises:



90
91
92
93
94
95
# File 'lib/userbin/userbin.rb', line 90

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