userbin 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3b49115ba8bce94342e0738a96b33f6c95102e9b
4
- data.tar.gz: 0b9596b630e74103533891606a1cdd96aa7214c4
3
+ metadata.gz: 9bdd5a2e5b60112f95a92dae7500b03dbea87ee9
4
+ data.tar.gz: 4766121c403480224819add35e1c65e8b37666d9
5
5
  SHA512:
6
- metadata.gz: a6c29ce4ffc880fa041f2c429427a4bcec59078ec2777b2d2b19d553721392e58561219c42edd533528cabe9454a1dd88f4fb4526739f0993ad3bda36d0c0623
7
- data.tar.gz: e67479d5e41349e976d87f462afff529e5d0b2d11cdd2e2ded7e3f07093e69b30322b80760ea0129b638a2a5d0cbfd451251bc00501207f238cd1043b873b4c1
6
+ metadata.gz: ceebaf8f995b7adc429b83601dead50efea180b7f2410bad462752b548b9402ef5d5ffd1af2840cf763e7cdd593e8edfca0b4fffdc064e3e14d506acdacfb9b3
7
+ data.tar.gz: 042c0a0bcad92c24e50c05b6adc0929c72736bc0fc75a860b3aa2e63060ea4a08745171dd6985ca1d5bd57656d34140067ca6177768f9d944e090f43c86aa663
data/README.md CHANGED
@@ -1,4 +1,76 @@
1
1
  Userbin Ruby gem
2
2
  ================
3
3
 
4
- Hold tight for more info.
4
+ Installation
5
+ ------------
6
+
7
+ Begin with signing up at [https://userbin.com](https://userbin.com) to obtain
8
+ your App ID and API secret.
9
+
10
+ For simplicity’s sake, we will use the [Sinatra](http://www.sinatrarb.com/) framework. Start by installing Userbin and Sinatra:
11
+
12
+ ```bash
13
+ $ gem install sinatra userbin
14
+ ```
15
+
16
+ Now create a file called app.rb, require the gems and configure Userbin.
17
+
18
+ Set up your restricted path to which users will be redirected on a successful logins. Browsing to this path or a sub-path will require the user to login. Logging out redirects the user back to the root path.
19
+
20
+ ```ruby
21
+ # app.rb
22
+ require "sinatra"
23
+ require "userbin"
24
+
25
+ Userbin.app_id = "15_DIGIT_APP_ID"
26
+ Userbin.api_secret = "32_BYTE_API_SECRET"
27
+
28
+ use Userbin::Authentication, restricted_path: '/admin'
29
+ ```
30
+
31
+ That's it! People are now able sign up and log in to your application.
32
+
33
+ Usage
34
+ -----
35
+
36
+ ### Signup, login and logout
37
+
38
+ To make installation as easy as possible, markup required for the Userbin UI are automatically inserted before the closing </body> and </head> tags in your HTML. It is therefore important that these tags are present on all pages where you want to use the links below.
39
+
40
+ These links will open up the [Userbin Widget](https://userbin.com/docs/javascript#widget) with either the login or signup form.
41
+
42
+ ```html
43
+ <!-- put this on a public page -->
44
+ <a class="ub-login">Login</a>
45
+ or
46
+ <a class="ub-signup">Signup</a>
47
+ ```
48
+
49
+ The logout link will clear the session and redirect the user back to your root path:
50
+
51
+ ```html
52
+ <!-- put this on a restricted page -->
53
+ <a class="ub-logout">Log out</a>
54
+ ```
55
+
56
+ See the [Javascript reference](https://userbin.com/docs/javascript#markup) for more info on this markup.
57
+
58
+ ### The current user
59
+
60
+ Userbin keeps track of the currently logged in user:
61
+
62
+ ```erb
63
+ Welcome to your account, <%= Userbin.user.email %>
64
+ ```
65
+
66
+ To check if a user is logged in, use the following helper:
67
+
68
+ ```erb
69
+ <% if Userbin.authenticated? %>
70
+ You are logged in!
71
+ <% end %>
72
+ ```
73
+
74
+ Documentation
75
+ -------------
76
+ For complete documentation go to [userbin.com/docs](https://userbin.com/docs)
@@ -18,7 +18,7 @@ module Userbin
18
18
  signature, data = Userbin.authenticate_events!(request)
19
19
 
20
20
  MultiJson.decode(data)['events'].each do |event|
21
- Userbin.trigger(event)
21
+ Userbin::Events.trigger(event)
22
22
  end
23
23
 
24
24
  [ 200, { 'Content-Type' => 'text/html',
@@ -51,7 +51,7 @@ module Userbin
51
51
  end
52
52
 
53
53
  def restrict
54
- Userbin.restricted_path || @restricted_path
54
+ Userbin.config.restricted_path || @restricted_path
55
55
  end
56
56
 
57
57
  def link_tags(login_path)
@@ -72,7 +72,7 @@ module Userbin
72
72
  "https://userbin.com/js/v0"
73
73
  }
74
74
  str = <<-SCRIPT_TAG
75
- <script src="#{script_url}?#{Userbin.app_id}"></script>
75
+ <script src="#{script_url}?#{Userbin.config.app_id}"></script>
76
76
  SCRIPT_TAG
77
77
  end
78
78
 
@@ -1,7 +1,7 @@
1
1
  module Userbin
2
2
  class BasicAuth < Faraday::Middleware
3
3
  def call(env)
4
- value = Base64.encode64([Userbin.app_id, Userbin.api_secret].join(':'))
4
+ value = Base64.encode64([Userbin.config.app_id, Userbin.config.api_secret].join(':'))
5
5
  value.gsub!("\n", '')
6
6
  env[:request_headers]["Authorization"] = "Basic #{value}"
7
7
  @app.call(env)
@@ -0,0 +1,8 @@
1
+ module Userbin
2
+ class Configuration
3
+ attr_accessor :app_id
4
+ attr_accessor :api_secret
5
+ attr_accessor :user_model
6
+ attr_accessor :restricted_path
7
+ end
8
+ end
@@ -0,0 +1,44 @@
1
+ module Userbin
2
+
3
+ Callback = Struct.new(:pattern, :block) do; end
4
+
5
+ class Events
6
+ def self.on(*names, &block)
7
+ pattern = Regexp.union(names.empty? ? TYPE_LIST.to_a : names)
8
+ callbacks.each do |callback|
9
+ if pattern == callback.pattern
10
+ callbacks.delete(callback)
11
+ callbacks << Userbin::Callback.new(pattern, block)
12
+ return
13
+ end
14
+ end
15
+ callbacks << Userbin::Callback.new(pattern, block)
16
+ end
17
+
18
+ def self.trigger(raw_event)
19
+ event = Userbin::Event.new(raw_event)
20
+ callbacks.each do |callback|
21
+ if event.type =~ callback.pattern
22
+ object = case event['type']
23
+ when /^user\./
24
+ Userbin::User.new(event.object)
25
+ else
26
+ event.object
27
+ end
28
+ model = event.instance_exec object, &callback.block
29
+
30
+ if event.type =~ /user\.created/ && model.respond_to?(:id)
31
+ object.update_local_id(model.id)
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def self.callbacks
40
+ @callbacks ||= []
41
+ end
42
+ end
43
+
44
+ end
@@ -0,0 +1,7 @@
1
+ module UserbinRails
2
+ class Railtie < Rails::Railtie
3
+ initializer "userbin" do |app|
4
+ app.config.middleware.use "Userbin::Authentication"
5
+ end
6
+ end
7
+ end
@@ -1,11 +1,4 @@
1
1
  module Userbin
2
-
3
- Callback = Struct.new(:pattern, :block) do; end
4
-
5
- class << self
6
- attr_accessor :app_id, :api_secret, :restricted_path
7
- end
8
-
9
2
  def self.authenticate_events!(request, now = Time.now)
10
3
  signature, data =
11
4
  request.params.values_at('userbin_signature', 'userbin_data')
@@ -43,9 +36,9 @@ module Userbin
43
36
  def self.refresh_session(user_id)
44
37
  api_endpoint = ENV["USERBIN_API_ENDPOINT"] || 'https://userbin.com/api/v0'
45
38
  uri = URI("#{api_endpoint}/users/#{user_id}/sessions")
46
- uri.user = app_id
47
- uri.password = api_secret
48
39
  net = Net::HTTP.post_form(uri, {})
40
+ uri.user = config.app_id
41
+ uri.password = config.api_secret
49
42
  [net['X-Userbin-Signature'], net.body]
50
43
  end
51
44
 
@@ -69,54 +62,13 @@ module Userbin
69
62
  current_user
70
63
  end
71
64
 
72
- # Event handling
73
- #
74
- class << self
75
- def on(*names, &block)
76
- pattern = Regexp.union(names.empty? ? TYPE_LIST.to_a : names)
77
- callbacks.each do |callback|
78
- if pattern == callback.pattern
79
- callbacks.delete(callback)
80
- callbacks << Userbin::Callback.new(pattern, block)
81
- return
82
- end
83
- end
84
- callbacks << Userbin::Callback.new(pattern, block)
85
- end
86
-
87
- def trigger(raw_event)
88
- event = Userbin::Event.new(raw_event)
89
- callbacks.each do |callback|
90
- if event.type =~ callback.pattern
91
- object = case event['type']
92
- when /^user\./
93
- Userbin::User.new(event.object)
94
- else
95
- event.object
96
- end
97
- model = event.instance_exec object, &callback.block
98
-
99
- if event.type =~ /user\.created/ && model.respond_to?(:id)
100
- object.update_local_id(model.id)
101
- end
102
- end
103
- end
104
- end
105
-
106
- private
107
-
108
- def callbacks
109
- @callbacks ||= []
110
- end
111
- end
112
-
113
65
  private
114
66
 
115
67
  # Checks signature against secret and returns boolean
116
68
  #
117
69
  def self.valid_signature?(signature, data)
118
70
  digest = OpenSSL::Digest::SHA256.new
119
- valid = signature == OpenSSL::HMAC.hexdigest(digest, api_secret, data)
71
+ valid = signature == OpenSSL::HMAC.hexdigest(digest, config.api_secret, data)
120
72
  raise SecurityError, "Invalid signature" unless valid
121
73
  valid
122
74
  end
@@ -0,0 +1,3 @@
1
+ module Userbin
2
+ VERSION = "0.2.0"
3
+ end
data/lib/userbin.rb CHANGED
@@ -6,6 +6,8 @@ require 'net/http'
6
6
  require "userbin/userbin"
7
7
  require "userbin/basic_auth"
8
8
 
9
+ require "userbin/railtie" if defined?(Rails::Railtie)
10
+
9
11
  api_endpoint = ENV.fetch('USERBIN_API_ENDPOINT') {
10
12
  "https://userbin.com/api/v0"
11
13
  }
@@ -18,6 +20,8 @@ api_endpoint = ENV.fetch('USERBIN_API_ENDPOINT') {
18
20
  c.use Userbin::VerifySignature
19
21
  end
20
22
 
23
+ require "userbin/configuration"
24
+ require "userbin/events"
21
25
  require "userbin/current"
22
26
  require "userbin/session"
23
27
  require "userbin/authentication"
@@ -25,4 +29,20 @@ require "userbin/authentication"
25
29
  class Userbin::Error < Exception; end
26
30
  class Userbin::SecurityError < Userbin::Error; end
27
31
 
32
+ module Userbin
33
+ class << self
34
+ def configure(config_hash=nil)
35
+ if config_hash
36
+ config_hash.each do |k,v|
37
+ config.send("#{k}=", v)
38
+ end
39
+ end
40
+
41
+ yield(config) if block_given?
42
+ end
28
43
 
44
+ def config
45
+ @configuration ||= Userbin::Configuration.new
46
+ end
47
+ end
48
+ end
data/spec/session_spec.rb CHANGED
@@ -3,8 +3,10 @@ require 'multi_json'
3
3
 
4
4
  describe 'Userbin::Session' do
5
5
  before do
6
- Userbin.app_id = '100000000000000'
7
- Userbin.api_secret = 'test'
6
+ Userbin.configure do |config|
7
+ config.app_id = '100000000000000'
8
+ config.api_secret = 'test'
9
+ end
8
10
  end
9
11
 
10
12
  before do
data/spec/userbin_spec.rb CHANGED
@@ -3,8 +3,10 @@ require 'cgi'
3
3
 
4
4
  describe Userbin do
5
5
  before do
6
- Userbin.app_id = '1000'
7
- Userbin.api_secret = '1234'
6
+ Userbin.configure do |config|
7
+ config.app_id = '1000'
8
+ config.api_secret = '1234'
9
+ end
8
10
  end
9
11
 
10
12
  let (:args) do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: userbin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johan
@@ -89,9 +89,13 @@ extra_rdoc_files: []
89
89
  files:
90
90
  - lib/userbin/authentication.rb
91
91
  - lib/userbin/basic_auth.rb
92
+ - lib/userbin/configuration.rb
92
93
  - lib/userbin/current.rb
94
+ - lib/userbin/events.rb
95
+ - lib/userbin/railtie.rb
93
96
  - lib/userbin/session.rb
94
97
  - lib/userbin/userbin.rb
98
+ - lib/userbin/version.rb
95
99
  - lib/userbin.rb
96
100
  - README.md
97
101
  - spec/session_spec.rb