warden-openid 0.0.1 → 0.1.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.
@@ -1,9 +1,76 @@
1
- = warden-openid
1
+ = Warden OpenID Strategy
2
2
 
3
- Description goes here.
3
+ == Install
4
+
5
+ $ gem install warden-openid
6
+
7
+ == Usage
8
+
9
+ === 1. Configure Warden uses OpenID strategy
10
+
11
+ require 'warden-openid'
12
+
13
+ use Rack::Session::Cookie
14
+ use Rack::OpenID
15
+ use Warden::Manager do |manager|
16
+ manager.default_strategies :openid
17
+ manager.failure_app = FailureApp
18
+ end
19
+
20
+ === 2. Setup user finder
21
+
22
+ Warden::OpenID.configure do |config|
23
+ config.user_finder do |response|
24
+ User.find_by_identity_url(response.identity_url)
25
+ end
26
+ end
27
+
28
+ _response_ is an instance of <tt>OpenID::Consumer::Response</tt>.
29
+
30
+ === 3. Create route and view
31
+
32
+ Example by Sinatra and Haml:
33
+
34
+ post '/signin' do
35
+ authenticate!
36
+ end
37
+
38
+ %form(action='/signin' method='post')
39
+ %input(type='text' name='openid_identifier')
40
+ %input(type='submit' value='Sign in')
41
+
42
+ This strategy starts with _openid_identifier_ parameter.
43
+
44
+ You may need to customize <tt>/unauthenticated</tt> route. Please refer to examples directory for details.
45
+
46
+ == Fetch additional fields from server
47
+
48
+ Warden::OpenID.configure do |config|
49
+ config.required_fields = 'email'
50
+ config.optional_fields = %w(nickname fullname)
51
+
52
+ config.user_finder do |response|
53
+ fields = OpenID::SReg::Response.from_success_response(response)
54
+ p fields['email']
55
+ p fields['nickname']
56
+ end
57
+ end
58
+
59
+ == Caveats
60
+
61
+ If you use this with Rails, please don't use <tt>OpenID::Store::Memory</tt>. A problem occurs by class reloading in the development mode.
62
+
63
+ For example, <tt>OpenID::Store::Filesystem</tt> is used instead:
64
+
65
+ require 'openid/store/filesystem'
66
+ Rails.configuration.middleware.use Rack::OpenID, OpenID::Store::Filesystem.new(Rails.root + 'tmp/openid')
67
+
68
+ == Contributors
69
+
70
+ * Philip H. MacIver
4
71
 
5
72
  == Note on Patches/Pull Requests
6
-
73
+
7
74
  * Fork the project.
8
75
  * Make your feature addition or bug fix.
9
76
  * Add tests for it. This is important so I don't break it in a
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
@@ -0,0 +1 @@
1
+ .bundle/*
@@ -0,0 +1,6 @@
1
+ source :rubygems
2
+
3
+ gem 'sinatra'
4
+ gem 'warden-openid'
5
+ gem 'haml'
6
+ gem 'rack-flash'
@@ -0,0 +1,39 @@
1
+ ---
2
+ dependencies:
3
+ haml:
4
+ group:
5
+ - :default
6
+ version: ">= 0"
7
+ rack-flash:
8
+ group:
9
+ - :default
10
+ version: ">= 0"
11
+ warden-openid:
12
+ group:
13
+ - :default
14
+ version: ">= 0"
15
+ sinatra:
16
+ group:
17
+ - :default
18
+ version: ">= 0"
19
+ specs:
20
+ - haml:
21
+ version: 3.0.10
22
+ - rack:
23
+ version: 1.1.0
24
+ - rack-flash:
25
+ version: 0.1.1
26
+ - ruby-openid:
27
+ version: 2.1.7
28
+ - rack-openid:
29
+ version: 1.0.3
30
+ - sinatra:
31
+ version: "1.0"
32
+ - warden:
33
+ version: 0.10.7
34
+ - warden-openid:
35
+ version: 0.0.1
36
+ hash: a1205587e00609d6a930be402bdd2afbd252e0c0
37
+ sources:
38
+ - Rubygems:
39
+ uri: http://gemcutter.org
@@ -0,0 +1,5 @@
1
+ $ gem install bundler
2
+ $ bundle install
3
+ $ rackup
4
+
5
+ visit http://localhost:9292
@@ -0,0 +1,84 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.setup
4
+ Bundler.require :default
5
+
6
+ users = {}
7
+
8
+ Warden::OpenID.configure do |config|
9
+ config.user_finder do |response|
10
+ users[response.identity_url]
11
+ end
12
+ end
13
+
14
+ helpers do
15
+ def warden
16
+ env['warden']
17
+ end
18
+ end
19
+
20
+ get '/' do
21
+ haml <<-'HAML'
22
+ %p#notice= flash[:notice]
23
+ %p#error= flash[:error]
24
+
25
+ - if warden.authenticated?
26
+ %p
27
+ Welcome #{warden.user}!
28
+ %a(href='/signout') Sign out
29
+ - else
30
+ %form(action='/signin' method='post')
31
+ %p
32
+ %label
33
+ OpenID:
34
+ %input(type='text' name='openid_identifier')
35
+ %input(type='submit' value='Sign in')
36
+ HAML
37
+ end
38
+
39
+ post '/signin' do
40
+ warden.authenticate!
41
+ flash[:notice] = 'You signed in'
42
+ redirect '/'
43
+ end
44
+
45
+ get '/signout' do
46
+ warden.logout(:default)
47
+ flash[:notice] = 'You signed out'
48
+ redirect '/'
49
+ end
50
+
51
+ post '/unauthenticated' do
52
+ if openid = env['warden.options'][:openid]
53
+ # OpenID authenticate success, but user is missing
54
+ # (Warden::OpenID.user_finder returns nil)
55
+ session[:identity_url] = openid[:response].identity_url
56
+ redirect '/register'
57
+ else
58
+ # OpenID authenticate failure
59
+ flash[:error] = warden.message
60
+ redirect '/'
61
+ end
62
+ end
63
+
64
+ get '/register' do
65
+ haml <<-'HAML'
66
+ %form(action='/signup' method='post')
67
+ %p
68
+ %label
69
+ Name:
70
+ %input(type='text' name='name')
71
+ %input(type='submit' value='Sign up')
72
+ HAML
73
+ end
74
+
75
+ post '/signup' do
76
+ if (name = params[:name]).empty?
77
+ redirect '/register'
78
+ else
79
+ users[session.delete(:identity_url)] = name
80
+ warden.set_user name
81
+ flash[:notice] = 'You signed up'
82
+ redirect '/'
83
+ end
84
+ end
@@ -0,0 +1,12 @@
1
+ require 'app'
2
+
3
+ use Rack::Session::Cookie
4
+ use Rack::OpenID
5
+
6
+ use Warden::Manager do |manager|
7
+ manager.default_strategies :openid
8
+ manager.failure_app = Sinatra::Application
9
+ end
10
+
11
+ use Rack::Flash
12
+ run Sinatra::Application
@@ -3,8 +3,51 @@ require 'rack/openid'
3
3
 
4
4
  module Warden
5
5
  module OpenID
6
- def self.user_finder(&block)
7
- block ? @@_user_finder = block : @@_user_finder
6
+ CONFIG_EXAMPLE = <<-CODE
7
+ Warden::OpenID.configure do |config|
8
+ config.user_finder do |response|
9
+ # do something
10
+ end
11
+ end
12
+ CODE
13
+
14
+ class Config
15
+ attr_accessor :required_fields, :optional_fields, :policy_url
16
+
17
+ def user_finder(&block)
18
+ @user_finder = block
19
+ end
20
+
21
+ def find_user(response)
22
+ raise "Warden::OpenID::Config#user_finder has not been set yet.\n\n#{Warden::OpenID::CONFIG_EXAMPLE}" unless @user_finder
23
+ @user_finder.call(response)
24
+ end
25
+
26
+ def to_params
27
+ {
28
+ :required => required_fields,
29
+ :optional => optional_fields,
30
+ :policy_url => policy_url
31
+ }
32
+ end
33
+ end
34
+
35
+ class << self
36
+ def config
37
+ @@config ||= Config.new
38
+ end
39
+
40
+ def configure(&block)
41
+ block.call(config)
42
+ end
43
+
44
+ def user_finder(&block)
45
+ $stderr.puts "DEPRECATION WARNING: Warden::OpenID.user_finder is deprecated. Use Warden::OpenID::Config#user_finder instead.\n\n#{CONFIG_EXAMPLE}"
46
+
47
+ configure do |config|
48
+ config.user_finder(&block)
49
+ end
50
+ end
8
51
  end
9
52
 
10
53
  class Strategy < Warden::Strategies::Base
@@ -12,7 +55,7 @@ module Warden
12
55
  if response = env[Rack::OpenID::RESPONSE]
13
56
  case response.status
14
57
  when :success
15
- if user = Warden::OpenID.user_finder.call(response)
58
+ if user = Warden::OpenID.config.find_user(response)
16
59
  success!(user)
17
60
  else
18
61
  fail!('User not found')
@@ -22,10 +65,10 @@ module Warden
22
65
  fail!(response.respond_to?(:message) ? response.message : "OpenID authentication failed: #{response.status}")
23
66
  end
24
67
  elsif identifier = params['openid_identifier']
25
- if identifier.empty?
68
+ if identifier.nil? || identifier.empty?
26
69
  fail!('OpenID identifier is required')
27
70
  else
28
- custom!([401, {'WWW-Authenticate' => Rack::OpenID.build_header(:identifier => identifier)}, ''])
71
+ custom!([401, {'WWW-Authenticate' => Rack::OpenID.build_header(Warden::OpenID.config.to_params.merge(:identifier => identifier))}, ''])
29
72
  end
30
73
  end
31
74
  end
@@ -0,0 +1,69 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{warden-openid}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Keita Urashima"]
12
+ s.date = %q{2010-06-10}
13
+ s.description = %q{A warden strategy for authenticate with OpenID}
14
+ s.email = %q{ursm@ursm.jp}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "examples/sinatra/.gitignore",
27
+ "examples/sinatra/Gemfile",
28
+ "examples/sinatra/Gemfile.lock",
29
+ "examples/sinatra/README",
30
+ "examples/sinatra/app.rb",
31
+ "examples/sinatra/config.ru",
32
+ "lib/warden-openid.rb",
33
+ "lib/warden/openid.rb",
34
+ "spec/spec.opts",
35
+ "spec/spec_helper.rb",
36
+ "spec/warden-openid_spec.rb",
37
+ "warden-openid.gemspec"
38
+ ]
39
+ s.homepage = %q{http://github.com/ursm/warden-openid}
40
+ s.rdoc_options = ["--charset=UTF-8"]
41
+ s.require_paths = ["lib"]
42
+ s.rubygems_version = %q{1.3.7}
43
+ s.summary = %q{A warden strategy for authenticate with OpenID}
44
+ s.test_files = [
45
+ "spec/spec_helper.rb",
46
+ "spec/warden-openid_spec.rb",
47
+ "examples/sinatra/app.rb"
48
+ ]
49
+
50
+ if s.respond_to? :specification_version then
51
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
52
+ s.specification_version = 3
53
+
54
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
55
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
56
+ s.add_runtime_dependency(%q<warden>, [">= 0"])
57
+ s.add_runtime_dependency(%q<rack-openid>, [">= 0"])
58
+ else
59
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
60
+ s.add_dependency(%q<warden>, [">= 0"])
61
+ s.add_dependency(%q<rack-openid>, [">= 0"])
62
+ end
63
+ else
64
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
65
+ s.add_dependency(%q<warden>, [">= 0"])
66
+ s.add_dependency(%q<rack-openid>, [">= 0"])
67
+ end
68
+ end
69
+
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: warden-openid
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 27
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 0
8
8
  - 1
9
- version: 0.0.1
9
+ - 0
10
+ version: 0.1.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Keita Urashima
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-04-19 00:00:00 +09:00
18
+ date: 2010-06-10 00:00:00 +09: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,9 +38,11 @@ dependencies:
35
38
  name: warden
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: 3
41
46
  segments:
42
47
  - 0
43
48
  version: "0"
@@ -47,9 +52,11 @@ dependencies:
47
52
  name: rack-openid
48
53
  prerelease: false
49
54
  requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
50
56
  requirements:
51
57
  - - ">="
52
58
  - !ruby/object:Gem::Version
59
+ hash: 3
53
60
  segments:
54
61
  - 0
55
62
  version: "0"
@@ -71,11 +78,18 @@ files:
71
78
  - README.rdoc
72
79
  - Rakefile
73
80
  - VERSION
81
+ - examples/sinatra/.gitignore
82
+ - examples/sinatra/Gemfile
83
+ - examples/sinatra/Gemfile.lock
84
+ - examples/sinatra/README
85
+ - examples/sinatra/app.rb
86
+ - examples/sinatra/config.ru
74
87
  - lib/warden-openid.rb
75
88
  - lib/warden/openid.rb
76
89
  - spec/spec.opts
77
90
  - spec/spec_helper.rb
78
91
  - spec/warden-openid_spec.rb
92
+ - warden-openid.gemspec
79
93
  has_rdoc: true
80
94
  homepage: http://github.com/ursm/warden-openid
81
95
  licenses: []
@@ -86,26 +100,31 @@ rdoc_options:
86
100
  require_paths:
87
101
  - lib
88
102
  required_ruby_version: !ruby/object:Gem::Requirement
103
+ none: false
89
104
  requirements:
90
105
  - - ">="
91
106
  - !ruby/object:Gem::Version
107
+ hash: 3
92
108
  segments:
93
109
  - 0
94
110
  version: "0"
95
111
  required_rubygems_version: !ruby/object:Gem::Requirement
112
+ none: false
96
113
  requirements:
97
114
  - - ">="
98
115
  - !ruby/object:Gem::Version
116
+ hash: 3
99
117
  segments:
100
118
  - 0
101
119
  version: "0"
102
120
  requirements: []
103
121
 
104
122
  rubyforge_project:
105
- rubygems_version: 1.3.6
123
+ rubygems_version: 1.3.7
106
124
  signing_key:
107
125
  specification_version: 3
108
126
  summary: A warden strategy for authenticate with OpenID
109
127
  test_files:
110
128
  - spec/spec_helper.rb
111
129
  - spec/warden-openid_spec.rb
130
+ - examples/sinatra/app.rb