priit-openid_wrapper 0.1.7 → 0.1.8

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.
@@ -52,7 +52,7 @@ Add to config/routes.rb:
52
52
  map.login '/login', :controller => 'sessions', :action => 'new'
53
53
  map.logout '/logout', :controller => 'sessions', :action => 'destroy'
54
54
 
55
- Add to app/controller/sessions_controller.rb # Look how slim and clean controller :-)
55
+ Add to app/controller/sessions_controller.rb
56
56
  def create
57
57
  begin_openid # you can change defaults like :return_url => complete_sessions_url etc
58
58
  # take a look lib/openid_wrapper/openid_wrapper.rb def begin_openid
@@ -0,0 +1 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/openid_wrapper/openid_wrapper')
@@ -0,0 +1,9 @@
1
+ require 'openid/association'
2
+
3
+ class Association < ActiveRecord::Base
4
+ set_table_name 'openid_associations'
5
+ def from_record
6
+ OpenID::Association.new(handle, secret, issued, lifetime, assoc_type)
7
+ end
8
+ end
9
+
@@ -0,0 +1,3 @@
1
+ class Nonce < ActiveRecord::Base
2
+ set_table_name 'openid_nonces'
3
+ end
@@ -0,0 +1,57 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/association')
2
+ require File.expand_path(File.dirname(__FILE__) + '/nonce')
3
+ require 'openid/store/interface'
4
+
5
+ # not in OpenID module to avoid namespace conflict
6
+ class ActiveRecordStore < OpenID::Store::Interface
7
+ def store_association(server_url, assoc)
8
+ remove_association(server_url, assoc.handle)
9
+ Association.create(:server_url => server_url,
10
+ :handle => assoc.handle,
11
+ :secret => assoc.secret,
12
+ :issued => assoc.issued,
13
+ :lifetime => assoc.lifetime,
14
+ :assoc_type => assoc.assoc_type)
15
+ end
16
+
17
+ def get_association(server_url, handle=nil)
18
+ assocs = if handle.blank?
19
+ Association.find_all_by_server_url(server_url)
20
+ else
21
+ Association.find_all_by_server_url_and_handle(server_url, handle)
22
+ end
23
+
24
+ assocs.reverse.each do |assoc|
25
+ a = assoc.from_record
26
+ if a.expires_in == 0
27
+ assoc.destroy
28
+ else
29
+ return a
30
+ end
31
+ end if assocs.any?
32
+
33
+ return nil
34
+ end
35
+
36
+ def remove_association(server_url, handle)
37
+ Association.delete_all(['server_url = ? AND handle = ?', server_url, handle]) > 0
38
+ end
39
+
40
+ def use_nonce(server_url, timestamp, salt)
41
+ return false if Nonce.find_by_server_url_and_timestamp_and_salt(server_url, timestamp, salt)
42
+ return false if (timestamp - Time.now.to_i).abs > OpenID::Nonce.skew
43
+ Nonce.create(:server_url => server_url, :timestamp => timestamp, :salt => salt)
44
+ return true
45
+ end
46
+
47
+ def cleanup_nonces
48
+ now = Time.now.to_i
49
+ Nonce.delete_all(["timestamp > ? OR timestamp < ?", now + OpenID::Nonce.skew, now - OpenID::Nonce.skew])
50
+ end
51
+
52
+ def cleanup_associations
53
+ now = Time.now.to_i
54
+ Association.delete_all(['issued + lifetime > ?',now])
55
+ end
56
+
57
+ end
@@ -0,0 +1,146 @@
1
+ require 'openid'
2
+ require 'openid/extensions/sreg'
3
+ require 'openid/extensions/pape'
4
+ require File.expand_path(File.dirname(__FILE__) + '/openid_ar_store')
5
+
6
+ module OpenidWrapper
7
+ def self.included(base)
8
+ base.send :helper_method, :openid_params
9
+ end
10
+
11
+ protected
12
+ def begin_openid(options = {}, &check_user)
13
+ options.assert_valid_keys(
14
+ :openid_identifier, :return_url, :error_redirect, :realm,
15
+ :immediate_mode, :required, :optional,
16
+
17
+ # You can pass arguments to openid_params, so you can access it from complete_openid with openid_params.
18
+ # Example: begin_openid :params => {:subdomain => params[:subdomain]} in your create method and
19
+ # in you can access them at complete method like openid_params[:subdomain] or params[:subdomain].
20
+ :openid_params,
21
+
22
+ # redirect_to is sugar shortcut instead of writing :openid_params => {:redirect_to => params[:redirect_to]}
23
+ # later you can access it from openid_params[:redirect_to]
24
+ :redirect_to
25
+ )
26
+
27
+ # trying to be as flexible as possible
28
+ identifier = options[:openid_identifier] || params[:openid_identifier] || ''
29
+ return_url = options[:return_url] || complete_sessions_url
30
+ error_redirect = options[:error_redirect] || request.env['HTTP_REFERER'] || '/'
31
+ realm = options[:realm] || current_realm
32
+ immediate = options[:immediate_mode] || params[:immediate_mode] || false
33
+
34
+ begin
35
+ @openid_request = consumer.begin(identifier.strip)
36
+ rescue OpenID::OpenIDError => e
37
+ flash[:error] = "Discovery failed for #{identifier}: #{e}"
38
+ return redirect_to(error_redirect)
39
+ end
40
+
41
+ required = options[:required] || params[:required]
42
+ optional = options[:optional] || params[:optional]
43
+ sreg_request = simple_registration_request(required, optional)
44
+ @openid_request.add_extension(sreg_request)
45
+
46
+ if check_user
47
+ normalized_identifier = @openid_request.endpoint.claimed_id
48
+ yield normalized_identifier
49
+ end
50
+
51
+ add_to_params(options[:params])
52
+ add_to_params(:redirect_to => params[:redirect_to]) unless params[:redirect_to].nil?
53
+
54
+ redirect_to @openid_request.redirect_url(realm, return_url, immediate)
55
+ end
56
+
57
+ alias :create_openid :begin_openid
58
+
59
+ def complete_openid
60
+ # For wrapper DEVS:
61
+ # The return_to and its arguments are verified, so you need to pass in
62
+ # the base URL and the arguments. With Rails, the params method mashes
63
+ # together parameters from GET, POST, and the path, so you'll need to pull
64
+ # off the "path parameters"
65
+ params_without_paths = params.reject {|key,value| request.path_parameters.include?(key)}
66
+
67
+ # For wrapper DEVS:
68
+ # about current_realm from OpenID gem: Extract the URL of the current
69
+ # request from your application's web request framework and specify it here
70
+ # to have it checked against the openid.return_to value in the response. Do not
71
+ # just pass <tt>args['openid.return_to']</tt> here; that will defeat the
72
+ # purpose of this check. (See OpenID Authentication 2.0 section 11.1.)
73
+ @openid_response = consumer.complete(params_without_paths, current_realm)
74
+
75
+ # Add openid params to params[:openid]
76
+ params[:openid] = openid_params
77
+
78
+ return @openid_response
79
+ end
80
+
81
+ # For wrapper USERS:
82
+ # openid_params is just a helper method to filter out openid parameters from params, so
83
+ # you can directly save them to user model. By the way, you can access all them
84
+ # directly from rails params as well.
85
+ def openid_params
86
+ return nil if @openid_response.nil?
87
+
88
+ simple_registration = OpenID::SReg::Response.from_success_response(@openid_response).data
89
+ local_params = HashWithIndifferentAccess.new(simple_registration)
90
+
91
+ # For wrapper USERS:
92
+ # Use openid_params[:openid] for user interface and
93
+ # use openid_params[:openid_identifier] for querying your database or
94
+ # authorization server or other identifier equality comparisons.
95
+
96
+ # DOTO: I have to find out how much is display_identifier used before using it with identifier.
97
+ # local_params.merge!(:openid => @openid_response.display_identifier)
98
+ local_params.merge!(:openid_identifier => @openid_response.identity_url)
99
+
100
+ # DOTO: find out other way to access openid_params pool.
101
+ # Add custom params to openid_params pool.
102
+ # local_params.merge!(@openid_response.message.get_args(:bare_namespace))
103
+
104
+ return local_params
105
+ end
106
+
107
+ private
108
+ def consumer
109
+ OpenID::Consumer.new(session, ActiveRecordStore.new)
110
+ end
111
+
112
+ def simple_registration_request(required, optional)
113
+ required ||= []
114
+ optional ||= []
115
+
116
+ valid_attributes = %w[nickname fullname email dob gender postcode country timezone language]
117
+
118
+ if optional.size == 0 && required.size == 0
119
+ optional = valid_attributes
120
+ else
121
+ (required + optional).each do |atr|
122
+ raise "Invalid option: #{atr}. Must be one of: #{valid_attributes.join(', ')}" unless valid_attributes.index(atr)
123
+ end
124
+ end
125
+
126
+ sreg_request = OpenID::SReg::Request.new
127
+ sreg_request.request_fields(required, true) if required.size > 0
128
+ sreg_request.request_fields(optional, false) if optional.size > 0
129
+ return sreg_request
130
+ end
131
+
132
+ # For Wrapper DEVS:
133
+ # current_realm will be checked against openid.return_to value. Read more from method complete_openid.
134
+ def current_realm
135
+ request.protocol + request.host_with_port + request.relative_url_root + request.path
136
+ end
137
+
138
+ def add_to_params(args)
139
+ return nil if @openid_request.nil?
140
+ return nil if args.nil?
141
+
142
+ args.each do |key,value|
143
+ @openid_request.return_to_args[key.to_s] = value.to_s
144
+ end
145
+ end
146
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: priit-openid_wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Priit Tamboom
@@ -34,6 +34,12 @@ extra_rdoc_files:
34
34
  files:
35
35
  - README.rdoc
36
36
  - MIT-LICENSE
37
+ - CHANGLOG.rdoc
38
+ - lib/openid_wrapper.rb
39
+ - lib/openid_wrapper/openid_wrapper.rb
40
+ - lib/openid_wrapper/openid_ar_store.rb
41
+ - lib/openid_wrapper/nonce.rb
42
+ - lib/openid_wrapper/association.rb
37
43
  - CHANGELOG.rdoc
38
44
  has_rdoc: true
39
45
  homepage: http://priit.mx.ee/openid_wrapper