lasso 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,5 @@
1
+ !{float:right}http://www.jamesdaniels.net/b/lasso-logo.png!
2
+
1
3
  h1. Lasso
2
4
 
3
5
  h2. Identity herding with OAuth
@@ -11,11 +13,20 @@ Lasso works via decorators and attempts to have as few opinions about your setup
11
13
  * Can handle one-to-many associations with owners/tokens
12
14
  * Can handle multiple tokens from the same provider
13
15
  * Can handle any provider (OAuth 1 or 2) seamlessly by editing a simple configuration
16
+ * Seamlessly handles the 6 permutations of authentication (see below)
14
17
  * Isn't hard coded to work with one authentication library
15
18
  * Works well with STI or multiple token classes/controllers
16
19
 
17
20
  Lasso creates OAuth tokens via nested attributes on whichever object you deem to be the owner of those keys (e.g, current_user, current_user.account, User.new) which makes it one-to-many and quite flexible.
18
21
 
22
+ Cases that Lasso gives you hooks for:
23
+
24
+ # New token + no user logged in = Registration
25
+ # New token + user is logged in = Identity claim
26
+ # Existing token + no user logged in = Log in
27
+ # Existing token + owner logged in = Refresh secret/refresh keys
28
+ # Existing token + someone else logged in = Pass to conflict handler
29
+
19
30
  h3. Gettings started
20
31
 
21
32
  I haven't made generators for anything, yet. Feel free to skim this README in addition to checking out the "Lasso/Authlogic example application that I've built.":http://github.com/jamesdaniels/lasso-example
@@ -32,6 +43,7 @@ h3. Schema
32
43
 
33
44
  You are going to want a model with a schema that at least looks like this, you can call it what you wish:
34
45
 
46
+ <pre>
35
47
  create_table :access_keys, :force => true do |t|
36
48
  t.string "token_a", "token_b", :limit => 999
37
49
  t.string "service", "type", :null => false
@@ -39,11 +51,13 @@ You are going to want a model with a schema that at least looks like this, you c
39
51
  t.integer "owner_id"
40
52
  t.datetime "created_at", "updated_at", :null => false
41
53
  end
54
+ </pre>
42
55
 
43
56
  h3. Model
44
57
 
45
58
  Go ahead and add your provider details to the model, like so:
46
59
 
60
+ <pre>
47
61
  class AccessKey < ActiveRecord::Base
48
62
  oauth do
49
63
  provider '37signals' do
@@ -63,18 +77,22 @@ Go ahead and add your provider details to the model, like so:
63
77
  end
64
78
  end
65
79
  end
66
-
80
+ </pre>
81
+
67
82
  You'll want to setup the association to your owner model too:
68
83
 
84
+ <pre>
69
85
  class User < ActiveRecord::Base
70
86
  has_many :access_keys, :dependent => :destroy, :as => :owner
71
87
  accepts_nested_attributes_for :access_keys
72
88
  end
73
-
89
+ </pre>
90
+
74
91
  h3. Controller
75
92
 
76
93
  You are going to want a controller that is able to handle the requests:
77
94
 
95
+ <pre>
78
96
  class OauthController < ApplicationController
79
97
  processes_oauth_transactions_for :access_keys,
80
98
  :through => lambda { current_user || User.new },
@@ -90,9 +108,11 @@ You are going to want a controller that is able to handle the requests:
90
108
  # TODO: Merge accounts or display an error
91
109
  end
92
110
  end
111
+ </pre>
93
112
 
94
113
  And a controller to show the user their AccessKeys:
95
114
 
115
+ <pre>
96
116
  class AccessKeysController < ApplicationController
97
117
 
98
118
  def index
@@ -110,21 +130,26 @@ And a controller to show the user their AccessKeys:
110
130
  end
111
131
 
112
132
  end
133
+ </pre>
113
134
 
114
135
  h3. Routes
115
136
 
116
137
  And maybe some routes:
117
138
 
139
+ <pre>
118
140
  map.resources :access_keys, :only => [:index, :show, :destroy]
119
141
 
120
142
  map.oauth_authorize '/:service/oauth/start', :controller => 'oauth', :action => 'new'
121
143
  map.oauth_callback '/:service/oauth/callback', :controller => 'oauth', :action => 'create'
144
+ </pre>
122
145
 
123
146
  h3. Usage
124
147
 
125
148
  Now OAuth is as simple as adding a link:
126
149
 
150
+ <pre>
127
151
  <%= link_to 'Integrate your account with your 37signals account', oauth_authorize_path(:service => '37signals') %>
152
+ </pre>
128
153
 
129
154
  h3. Note on Patches/Pull Requests
130
155
 
data/Rakefile CHANGED
@@ -10,9 +10,9 @@ begin
10
10
  gem.email = "james@marginleft.com"
11
11
  gem.homepage = "http://github.com/jamesdaniels/lasso"
12
12
  gem.authors = ["James Daniels"]
13
- gem.add_development_dependency "rspec", ">= 1.2.9"
14
- gem.add_dependency "oauth2", ">= 0.0.10"
15
- gem.add_dependency "oauth"
13
+ gem.add_development_dependency "rspec", "~> 1.2.9"
14
+ gem.add_dependency "oauth2", "~> 0.1.0"
15
+ gem.add_dependency "oauth", "~> 0.4.4"
16
16
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
17
  end
18
18
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{lasso}
8
- s.version = "0.2.0"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["James Daniels"]
12
- s.date = %q{2010-06-26}
12
+ s.date = %q{2010-11-12}
13
13
  s.description = %q{Identity herding with OAuth}
14
14
  s.email = %q{james@marginleft.com}
15
15
  s.extra_rdoc_files = [
@@ -45,7 +45,7 @@ Gem::Specification.new do |s|
45
45
  s.homepage = %q{http://github.com/jamesdaniels/lasso}
46
46
  s.rdoc_options = ["--charset=UTF-8"]
47
47
  s.require_paths = ["lib"]
48
- s.rubygems_version = %q{1.3.6}
48
+ s.rubygems_version = %q{1.3.7}
49
49
  s.summary = %q{Identity herding with OAuth}
50
50
  s.test_files = [
51
51
  "spec/controllers.rb",
@@ -59,19 +59,19 @@ Gem::Specification.new do |s|
59
59
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
60
60
  s.specification_version = 3
61
61
 
62
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
63
- s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
64
- s.add_runtime_dependency(%q<oauth2>, [">= 0.0.10"])
65
- s.add_runtime_dependency(%q<oauth>, [">= 0"])
62
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
63
+ s.add_development_dependency(%q<rspec>, ["~> 1.2.9"])
64
+ s.add_runtime_dependency(%q<oauth2>, ["~> 0.1.0"])
65
+ s.add_runtime_dependency(%q<oauth>, ["~> 0.4.4"])
66
66
  else
67
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
68
- s.add_dependency(%q<oauth2>, [">= 0.0.10"])
69
- s.add_dependency(%q<oauth>, [">= 0"])
67
+ s.add_dependency(%q<rspec>, ["~> 1.2.9"])
68
+ s.add_dependency(%q<oauth2>, ["~> 0.1.0"])
69
+ s.add_dependency(%q<oauth>, ["~> 0.4.4"])
70
70
  end
71
71
  else
72
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
73
- s.add_dependency(%q<oauth2>, [">= 0.0.10"])
74
- s.add_dependency(%q<oauth>, [">= 0"])
72
+ s.add_dependency(%q<rspec>, ["~> 1.2.9"])
73
+ s.add_dependency(%q<oauth2>, ["~> 0.1.0"])
74
+ s.add_dependency(%q<oauth>, ["~> 0.4.4"])
75
75
  end
76
76
  end
77
77
 
@@ -57,7 +57,7 @@ module Lasso
57
57
 
58
58
  def redirect
59
59
  if version_one?
60
- @request_token = @oauth.consumer.get_request_token(:oauth_callback => oauth_settings[:callback].bind(self).call)
60
+ @request_token = @oauth.client.get_request_token(:oauth_callback => oauth_settings[:callback].bind(self).call)
61
61
  session[:request_token] = @request_token
62
62
  redirect_to @request_token.authorize_url
63
63
  else
@@ -66,4 +66,4 @@ module Lasso
66
66
  end
67
67
  end
68
68
  end
69
- end
69
+ end
@@ -7,32 +7,14 @@ def define_oauth_one(parent)
7
7
 
8
8
  validates_presence_of :oauth_token, :oauth_token_secret
9
9
 
10
- def consumer
11
- @consumer ||= OAuth::Consumer.new(config(:key), config(:secret), :site => config(:site), :request_token_path => config(:request_token_path), :authorize_path => config(:authorize_path), :access_token_path => config(:access_token_path))
12
- end
13
-
14
10
  def client
15
- @client ||= case service
16
- when 'linkedin'
17
- LinkedIn::Client.new(config(:key), config(:secret))
18
- when 'twitter'
19
- Twitter::OAuth.new(config(:key), config(:secret))
20
- end
11
+ @client ||= OAuth::Consumer.new(config(:key), config(:secret), :site => config(:site), :request_token_path => config(:request_token_path), :authorize_path => config(:authorize_path), :access_token_path => config(:access_token_path))
21
12
  end
22
13
 
23
14
  def access
24
- unless @access
25
- client.authorize_from_access(oauth_token, oauth_token_secret)
26
- @access ||= case service
27
- when 'linkedin'
28
- client
29
- when 'twitter'
30
- Twitter::Base.new(client)
31
- end
32
- end
33
- @access
15
+ @access ||= OAuth::AccessToken.new(client, oauth_token, oauth_token_secret)
34
16
  end
35
17
 
36
18
  end
37
19
  OAUTHONE
38
- end
20
+ end
Binary file
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lasso
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 19
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 2
8
+ - 3
8
9
  - 0
9
- version: 0.2.0
10
+ version: 0.3.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - James Daniels
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-06-26 00:00:00 -04:00
18
+ date: 2010-11-12 00:00:00 -06:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: rspec
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
- - - ">="
27
+ - - ~>
26
28
  - !ruby/object:Gem::Version
29
+ hash: 13
27
30
  segments:
28
31
  - 1
29
32
  - 2
@@ -35,26 +38,32 @@ dependencies:
35
38
  name: oauth2
36
39
  prerelease: false
37
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
38
42
  requirements:
39
- - - ">="
43
+ - - ~>
40
44
  - !ruby/object:Gem::Version
45
+ hash: 27
41
46
  segments:
42
47
  - 0
48
+ - 1
43
49
  - 0
44
- - 10
45
- version: 0.0.10
50
+ version: 0.1.0
46
51
  type: :runtime
47
52
  version_requirements: *id002
48
53
  - !ruby/object:Gem::Dependency
49
54
  name: oauth
50
55
  prerelease: false
51
56
  requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
52
58
  requirements:
53
- - - ">="
59
+ - - ~>
54
60
  - !ruby/object:Gem::Version
61
+ hash: 7
55
62
  segments:
56
63
  - 0
57
- version: "0"
64
+ - 4
65
+ - 4
66
+ version: 0.4.4
58
67
  type: :runtime
59
68
  version_requirements: *id003
60
69
  description: Identity herding with OAuth
@@ -101,23 +110,27 @@ rdoc_options:
101
110
  require_paths:
102
111
  - lib
103
112
  required_ruby_version: !ruby/object:Gem::Requirement
113
+ none: false
104
114
  requirements:
105
115
  - - ">="
106
116
  - !ruby/object:Gem::Version
117
+ hash: 3
107
118
  segments:
108
119
  - 0
109
120
  version: "0"
110
121
  required_rubygems_version: !ruby/object:Gem::Requirement
122
+ none: false
111
123
  requirements:
112
124
  - - ">="
113
125
  - !ruby/object:Gem::Version
126
+ hash: 3
114
127
  segments:
115
128
  - 0
116
129
  version: "0"
117
130
  requirements: []
118
131
 
119
132
  rubyforge_project:
120
- rubygems_version: 1.3.6
133
+ rubygems_version: 1.3.7
121
134
  signing_key:
122
135
  specification_version: 3
123
136
  summary: Identity herding with OAuth