devise_openid_authenticatable 1.0.0.alpha1
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.
- data/.gitignore +1 -0
- data/README.md +102 -0
- data/Rakefile +41 -0
- data/VERSION +1 -0
- data/devise_openid_authenticatable.gemspec +53 -0
- data/lib/devise_openid_authenticatable/model.rb +9 -0
- data/lib/devise_openid_authenticatable/routes.rb +16 -0
- data/lib/devise_openid_authenticatable/schema.rb +5 -0
- data/lib/devise_openid_authenticatable/strategy.rb +43 -0
- data/lib/devise_openid_authenticatable.rb +11 -0
- data/rails/init.rb +1 -0
- metadata +111 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
pkg/*
|
data/README.md
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
devise_openid_authenticatable
|
2
|
+
==========================
|
3
|
+
|
4
|
+
Written by Nat Budin
|
5
|
+
|
6
|
+
devise_openid_authenticatable is [OpenID](http://openid.net) authentication support for
|
7
|
+
[Devise](http://github.com/plataformatec/devise) applications. It is very thin and uses
|
8
|
+
[Rack::OpenID](http://github.com/josh/rack-openid) for most of the actual work.
|
9
|
+
|
10
|
+
Requirements
|
11
|
+
------------
|
12
|
+
|
13
|
+
- Devise 1.0.6 or later (including 1.1 versions)
|
14
|
+
- rack-openid
|
15
|
+
|
16
|
+
Installation
|
17
|
+
------------
|
18
|
+
|
19
|
+
gem install --pre devise_openid_authenticatable
|
20
|
+
|
21
|
+
and add devise_openid_authenticatable to your Gemfile or config/environment.rb as a gem
|
22
|
+
dependency.
|
23
|
+
|
24
|
+
Example
|
25
|
+
-------
|
26
|
+
|
27
|
+
I've modified the devise_example application to work with this gem. You can find the results
|
28
|
+
[here](http://github.com/nbudin/devise_openid_example).
|
29
|
+
|
30
|
+
Setup
|
31
|
+
-----
|
32
|
+
|
33
|
+
Once devise\_openid\_authenticatable is installed, add the following to your user model:
|
34
|
+
|
35
|
+
devise :openid_authenticatable
|
36
|
+
|
37
|
+
You can also add other modules such as token_authenticatable, trackable, etc. Database_authenticatable
|
38
|
+
should work fine alongside openid_authenticatable.
|
39
|
+
|
40
|
+
You'll also need to set up the database schema for this:
|
41
|
+
|
42
|
+
create_table :users do |t|
|
43
|
+
t.openid_authenticatable
|
44
|
+
end
|
45
|
+
|
46
|
+
and, optionally, indexes:
|
47
|
+
|
48
|
+
add_index :users, :identity_url, :unique => true
|
49
|
+
|
50
|
+
In addition, you'll need to modify sessions/new.html.erb (or the appropriate scoped view if you're
|
51
|
+
using those). You need to add a field for identity_url, and remove username and password if you
|
52
|
+
aren't using database_authenticatable:
|
53
|
+
|
54
|
+
<% form_for resource_name, resource, :url => session_path(resource_name) do |f| -%>
|
55
|
+
<p><%= f.label :identity_url %></p>
|
56
|
+
<p><%= f.text_field :identity_url %></p>
|
57
|
+
|
58
|
+
<% if devise_mapping.rememberable? -%>
|
59
|
+
<p><%= f.check_box :remember_me %> <%= f.label :remember_me %></p>
|
60
|
+
<% end -%>
|
61
|
+
|
62
|
+
<p><%= f.submit "Sign in" %></p>
|
63
|
+
<% end -%>
|
64
|
+
|
65
|
+
Finally, you'll need to add the following in your Rails configuration:
|
66
|
+
|
67
|
+
config.middleware.use Rack::OpenID
|
68
|
+
|
69
|
+
which is the Rack middleware that actually does most of the heavy lifting here.
|
70
|
+
|
71
|
+
Automatically creating users
|
72
|
+
----------------------------
|
73
|
+
|
74
|
+
If you want to have users automatically created when a new OpenID identity URL is
|
75
|
+
successfully used to sign in, you can implement a method called "create_from_identity_url"
|
76
|
+
to your user model class:
|
77
|
+
|
78
|
+
class User < ActiveRecord::Base
|
79
|
+
devise :openid_authenticatable
|
80
|
+
|
81
|
+
def self.create_from_identity_url(identity_url)
|
82
|
+
User.create(:identity_url => identity_url)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
Ideally I'd like to add support for using sreg attributes here as well, to populate other
|
87
|
+
fields in the user table.
|
88
|
+
|
89
|
+
See also
|
90
|
+
--------
|
91
|
+
|
92
|
+
* [OpenID](http://openid.net)
|
93
|
+
* [Rack::OpenID](http://github.com/josh/rack-openid)
|
94
|
+
* [Devise](http://github.com/plataformatec/devise)
|
95
|
+
* [Warden](http://github.com/hassox/warden)
|
96
|
+
|
97
|
+
TODO
|
98
|
+
----
|
99
|
+
|
100
|
+
* Add sreg attributes support
|
101
|
+
* Write test suite
|
102
|
+
* Test on non-ActiveRecord ORMs
|
data/Rakefile
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
desc 'Default: run unit tests.'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc 'Test the devise_openid_authenticatable plugin.'
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << 'lib'
|
11
|
+
t.libs << 'test'
|
12
|
+
t.pattern = 'test/**/*_test.rb'
|
13
|
+
t.verbose = true
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Generate documentation for the devise_openid_authenticatable plugin.'
|
17
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
18
|
+
rdoc.rdoc_dir = 'rdoc'
|
19
|
+
rdoc.title = 'devise_openid_authenticatable'
|
20
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
21
|
+
rdoc.rdoc_files.include('README')
|
22
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
begin
|
27
|
+
require 'jeweler'
|
28
|
+
Jeweler::Tasks.new do |gemspec|
|
29
|
+
gemspec.name = "devise_openid_authenticatable"
|
30
|
+
gemspec.summary = "OpenID authentication module for Devise"
|
31
|
+
gemspec.description = "OpenID authentication module for Devise using Rack::OpenID"
|
32
|
+
gemspec.email = "natbudin@gmail.com"
|
33
|
+
gemspec.homepage = "http://github.com/nbudin/devise_cas_authenticatable"
|
34
|
+
gemspec.authors = ["Nat Budin"]
|
35
|
+
gemspec.add_runtime_dependency "devise", ">= 1.0.6"
|
36
|
+
gemspec.add_runtime_dependency "rack-openid", "~> 1.0.3"
|
37
|
+
end
|
38
|
+
Jeweler::GemcutterTasks.new
|
39
|
+
rescue LoadError
|
40
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
41
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0.alpha1
|
@@ -0,0 +1,53 @@
|
|
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{devise_openid_authenticatable}
|
8
|
+
s.version = "1.0.0.alpha1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Nat Budin"]
|
12
|
+
s.date = %q{2010-05-21}
|
13
|
+
s.description = %q{OpenID authentication module for Devise using Rack::OpenID}
|
14
|
+
s.email = %q{natbudin@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.md"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".gitignore",
|
20
|
+
"README.md",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"devise_openid_authenticatable.gemspec",
|
24
|
+
"lib/devise_openid_authenticatable.rb",
|
25
|
+
"lib/devise_openid_authenticatable/model.rb",
|
26
|
+
"lib/devise_openid_authenticatable/routes.rb",
|
27
|
+
"lib/devise_openid_authenticatable/schema.rb",
|
28
|
+
"lib/devise_openid_authenticatable/strategy.rb",
|
29
|
+
"rails/init.rb"
|
30
|
+
]
|
31
|
+
s.homepage = %q{http://github.com/nbudin/devise_cas_authenticatable}
|
32
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
33
|
+
s.require_paths = ["lib"]
|
34
|
+
s.rubygems_version = %q{1.3.7}
|
35
|
+
s.summary = %q{OpenID authentication module for Devise}
|
36
|
+
|
37
|
+
if s.respond_to? :specification_version then
|
38
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
39
|
+
s.specification_version = 3
|
40
|
+
|
41
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
42
|
+
s.add_runtime_dependency(%q<devise>, [">= 1.0.6"])
|
43
|
+
s.add_runtime_dependency(%q<rack-openid>, ["~> 1.0.3"])
|
44
|
+
else
|
45
|
+
s.add_dependency(%q<devise>, [">= 1.0.6"])
|
46
|
+
s.add_dependency(%q<rack-openid>, ["~> 1.0.3"])
|
47
|
+
end
|
48
|
+
else
|
49
|
+
s.add_dependency(%q<devise>, [">= 1.0.6"])
|
50
|
+
s.add_dependency(%q<rack-openid>, ["~> 1.0.3"])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
if ActionController::Routing.name =~ /ActionDispatch/
|
2
|
+
# We're on Rails 3
|
3
|
+
ActionDispatch::Routing::Mapper.class_eval do
|
4
|
+
protected
|
5
|
+
|
6
|
+
alias_method :devise_openid, :devise_session
|
7
|
+
end
|
8
|
+
else
|
9
|
+
# We're on Rails 2
|
10
|
+
|
11
|
+
ActionController::Routing::RouteSet::Mapper.class_eval do
|
12
|
+
protected
|
13
|
+
|
14
|
+
alias_method :openid_authenticatable, :database_authenticatable
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'devise/strategies/base'
|
2
|
+
require 'rack/openid'
|
3
|
+
|
4
|
+
module Devise
|
5
|
+
module Strategies
|
6
|
+
class OpenidAuthenticatable < Base
|
7
|
+
def valid?
|
8
|
+
env[Rack::OpenID::RESPONSE] || (mapping.to.respond_to?(:find_by_identity_url) &&
|
9
|
+
params[scope] && !params[scope]["identity_url"].blank?)
|
10
|
+
end
|
11
|
+
|
12
|
+
def authenticate!
|
13
|
+
RAILS_DEFAULT_LOGGER.info("Authenticating with OpenID for mapping #{mapping.to}")
|
14
|
+
if resp = env[Rack::OpenID::RESPONSE]
|
15
|
+
RAILS_DEFAULT_LOGGER.info "Attempting OpenID auth: #{env["rack.openid.response"].inspect}"
|
16
|
+
case resp.status
|
17
|
+
when :success
|
18
|
+
u = mapping.to.find_by_identity_url(resp.identity_url)
|
19
|
+
if u
|
20
|
+
success!(u)
|
21
|
+
elsif mapping.to.respond_to?(:create_from_identity_url)
|
22
|
+
success!(mapping.to.create_from_identity_url(resp.identity_url))
|
23
|
+
else
|
24
|
+
fail!("This OpenID URL is not associated with any registered user")
|
25
|
+
end
|
26
|
+
when :cancel
|
27
|
+
fail!("OpenID auth cancelled")
|
28
|
+
when :failure
|
29
|
+
fail!("OpenID auth failed")
|
30
|
+
end
|
31
|
+
else
|
32
|
+
header_data = Rack::OpenID.build_header(:identifier => params[scope]["identity_url"])
|
33
|
+
RAILS_DEFAULT_LOGGER.info header_data
|
34
|
+
custom!([401, {
|
35
|
+
Rack::OpenID::AUTHENTICATE_HEADER => header_data
|
36
|
+
}, "Sign in with OpenID"])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
Warden::Strategies.add(:openid_authenticatable, Devise::Strategies::OpenidAuthenticatable)
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'devise'
|
2
|
+
|
3
|
+
require 'devise_openid_authenticatable/schema'
|
4
|
+
require 'devise_openid_authenticatable/strategy'
|
5
|
+
require 'devise_openid_authenticatable/routes'
|
6
|
+
|
7
|
+
Devise.add_module(:openid_authenticatable,
|
8
|
+
:strategy => true,
|
9
|
+
:model => 'devise_openid_authenticatable/model',
|
10
|
+
:controller => :sessions,
|
11
|
+
:route => :openid)
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "devise_openid_authenticatable"
|
metadata
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: devise_openid_authenticatable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: -1710980573
|
5
|
+
prerelease: true
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
- alpha1
|
11
|
+
version: 1.0.0.alpha1
|
12
|
+
platform: ruby
|
13
|
+
authors:
|
14
|
+
- Nat Budin
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2010-05-21 00:00:00 -04:00
|
20
|
+
default_executable:
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: devise
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 27
|
31
|
+
segments:
|
32
|
+
- 1
|
33
|
+
- 0
|
34
|
+
- 6
|
35
|
+
version: 1.0.6
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: rack-openid
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 17
|
47
|
+
segments:
|
48
|
+
- 1
|
49
|
+
- 0
|
50
|
+
- 3
|
51
|
+
version: 1.0.3
|
52
|
+
type: :runtime
|
53
|
+
version_requirements: *id002
|
54
|
+
description: OpenID authentication module for Devise using Rack::OpenID
|
55
|
+
email: natbudin@gmail.com
|
56
|
+
executables: []
|
57
|
+
|
58
|
+
extensions: []
|
59
|
+
|
60
|
+
extra_rdoc_files:
|
61
|
+
- README.md
|
62
|
+
files:
|
63
|
+
- .gitignore
|
64
|
+
- README.md
|
65
|
+
- Rakefile
|
66
|
+
- VERSION
|
67
|
+
- devise_openid_authenticatable.gemspec
|
68
|
+
- lib/devise_openid_authenticatable.rb
|
69
|
+
- lib/devise_openid_authenticatable/model.rb
|
70
|
+
- lib/devise_openid_authenticatable/routes.rb
|
71
|
+
- lib/devise_openid_authenticatable/schema.rb
|
72
|
+
- lib/devise_openid_authenticatable/strategy.rb
|
73
|
+
- rails/init.rb
|
74
|
+
has_rdoc: true
|
75
|
+
homepage: http://github.com/nbudin/devise_cas_authenticatable
|
76
|
+
licenses: []
|
77
|
+
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options:
|
80
|
+
- --charset=UTF-8
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
hash: 3
|
89
|
+
segments:
|
90
|
+
- 0
|
91
|
+
version: "0"
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
94
|
+
requirements:
|
95
|
+
- - ">"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
hash: 25
|
98
|
+
segments:
|
99
|
+
- 1
|
100
|
+
- 3
|
101
|
+
- 1
|
102
|
+
version: 1.3.1
|
103
|
+
requirements: []
|
104
|
+
|
105
|
+
rubyforge_project:
|
106
|
+
rubygems_version: 1.3.7
|
107
|
+
signing_key:
|
108
|
+
specification_version: 3
|
109
|
+
summary: OpenID authentication module for Devise
|
110
|
+
test_files: []
|
111
|
+
|