omniauth-identity 1.1.1 → 3.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +81 -0
- data/CODE_OF_CONDUCT.md +133 -0
- data/LICENSE +22 -0
- data/README.md +238 -0
- data/lib/omniauth-identity.rb +2 -0
- data/lib/omniauth-identity/version.rb +3 -1
- data/lib/omniauth/identity.rb +3 -2
- data/lib/omniauth/identity/model.rb +17 -14
- data/lib/omniauth/identity/models/active_record.rb +4 -1
- data/lib/omniauth/identity/models/couch_potato.rb +3 -4
- data/lib/omniauth/identity/models/mongoid.rb +3 -7
- data/lib/omniauth/identity/models/{mongo_mapper.rb → no_brainer.rb} +6 -4
- data/lib/omniauth/identity/secure_password.rb +4 -4
- data/lib/omniauth/strategies/identity.rb +92 -39
- data/spec/omniauth/identity/model_spec.rb +60 -59
- data/spec/omniauth/identity/models/active_record_spec.rb +24 -8
- data/spec/omniauth/identity/models/couch_potato_spec.rb +17 -11
- data/spec/omniauth/identity/models/mongoid_spec.rb +23 -13
- data/spec/omniauth/identity/models/no_brainer_spec.rb +17 -0
- data/spec/omniauth/identity/secure_password_spec.rb +12 -12
- data/spec/omniauth/strategies/identity_spec.rb +178 -67
- data/spec/spec_helper.rb +20 -6
- metadata +75 -128
- data/.gitignore +0 -4
- data/.rspec +0 -2
- data/Gemfile +0 -11
- data/Gemfile.lock +0 -179
- data/Guardfile +0 -10
- data/README.markdown +0 -202
- data/Rakefile +0 -9
- data/lib/omniauth/identity/models/data_mapper.rb +0 -32
- data/omniauth-identity.gemspec +0 -32
- data/spec/omniauth/identity/models/data_mapper_spec.rb +0 -22
- data/spec/omniauth/identity/models/mongo_mapper_spec.rb +0 -15
data/Guardfile
DELETED
data/README.markdown
DELETED
@@ -1,202 +0,0 @@
|
|
1
|
-
# OmniAuth Identity
|
2
|
-
|
3
|
-
The OmniAuth Identity gem provides a way for applications to utilize a
|
4
|
-
traditional login/password based authentication system without the need
|
5
|
-
to give up the simple authentication flow provided by OmniAuth. Identity
|
6
|
-
is designed on purpose to be as featureless as possible: it provides the
|
7
|
-
basic construct for user management and then gets out of the way.
|
8
|
-
|
9
|
-
## Usage
|
10
|
-
|
11
|
-
This can be a bit hard to understand the first time. Luckily, Ryan Bates made
|
12
|
-
a [Railscast](http://railscasts.com/episodes/304-omniauth-identity) about it!
|
13
|
-
|
14
|
-
You use `omniauth-identity` just like you would any other OmniAuth provider: as a
|
15
|
-
Rack middleware. The basic setup for a email/password authentication would
|
16
|
-
look something like this:
|
17
|
-
|
18
|
-
```ruby
|
19
|
-
use OmniAuth::Builder do
|
20
|
-
provider :identity, :fields => [:email]
|
21
|
-
end
|
22
|
-
```
|
23
|
-
|
24
|
-
Next, you need to create a model (called `Identity by default`) that will be
|
25
|
-
able to persist the information provided by the user. Luckily for you, there
|
26
|
-
are pre-built models for popular ORMs that make this dead simple.
|
27
|
-
|
28
|
-
**Note:** OmniAuth Identity is different from many other user authentication
|
29
|
-
systems in that it is *not* built to store authentication information in your primary
|
30
|
-
`User` model. Instead, the `Identity` model should be **associated** with your
|
31
|
-
`User` model giving you maximum flexibility to include other authentication
|
32
|
-
strategies such as Facebook, Twitter, etc.
|
33
|
-
|
34
|
-
### ActiveRecord
|
35
|
-
|
36
|
-
Just subclass `OmniAuth::Identity::Models::ActiveRecord` and provide fields
|
37
|
-
in the database for all of the fields you are using.
|
38
|
-
|
39
|
-
```ruby
|
40
|
-
class Identity < OmniAuth::Identity::Models::ActiveRecord
|
41
|
-
# Add whatever you like!
|
42
|
-
end
|
43
|
-
```
|
44
|
-
|
45
|
-
### Mongoid
|
46
|
-
|
47
|
-
Include the `OmniAuth::Identity::Models::Mongoid` mixin and specify
|
48
|
-
fields that you will need.
|
49
|
-
|
50
|
-
```ruby
|
51
|
-
class Identity
|
52
|
-
include Mongoid::Document
|
53
|
-
include OmniAuth::Identity::Models::Mongoid
|
54
|
-
|
55
|
-
field :email, type: String
|
56
|
-
field :name, type: String
|
57
|
-
field :password_digest, type: String
|
58
|
-
end
|
59
|
-
```
|
60
|
-
|
61
|
-
### MongoMapper
|
62
|
-
|
63
|
-
Include the `OmniAuth::Identity::Models::MongoMapper` mixin and specify
|
64
|
-
fields that you will need.
|
65
|
-
|
66
|
-
```ruby
|
67
|
-
class Identity
|
68
|
-
include MongoMapper::Document
|
69
|
-
include OmniAuth::Identity::Models::MongoMapper
|
70
|
-
|
71
|
-
key :email, String
|
72
|
-
key :name, String
|
73
|
-
key :password_digest, String
|
74
|
-
end
|
75
|
-
```
|
76
|
-
|
77
|
-
### DataMapper
|
78
|
-
|
79
|
-
Include the `OmniAuth::Identity::Models::DataMapper` mixin and specify
|
80
|
-
fields that you will need.
|
81
|
-
|
82
|
-
```ruby
|
83
|
-
class Identity
|
84
|
-
include DataMapper::Resource
|
85
|
-
include OmniAuth::Identity::Models::DataMapper
|
86
|
-
|
87
|
-
property :id, Serial
|
88
|
-
property :email, String
|
89
|
-
property :password_digest, Text
|
90
|
-
|
91
|
-
attr_accessor :password_confirmation
|
92
|
-
|
93
|
-
end
|
94
|
-
```
|
95
|
-
|
96
|
-
### CouchPotato
|
97
|
-
|
98
|
-
Include the `OmniAuth::Identity::Models::CouchPotatoModule` mixin and specify fields that you will need.
|
99
|
-
|
100
|
-
```ruby
|
101
|
-
class Identity
|
102
|
-
include CouchPotato::Persistence
|
103
|
-
include OmniAuth::Identity::Models::CouchPotatoModule
|
104
|
-
|
105
|
-
property :email
|
106
|
-
property :password_digest
|
107
|
-
|
108
|
-
def self.where search_hash
|
109
|
-
CouchPotato.database.view Identity.by_email(:key => search_hash)
|
110
|
-
end
|
111
|
-
|
112
|
-
view :by_email, :key => :email
|
113
|
-
end
|
114
|
-
```
|
115
|
-
|
116
|
-
Once you've got an Identity persistence model and the strategy up and
|
117
|
-
running, you can point users to `/auth/identity` and it will request
|
118
|
-
that they log in or give them the opportunity to sign up for an account.
|
119
|
-
Once they have authenticated with their identity, OmniAuth will call
|
120
|
-
through to `/auth/identity/callback` with the same kinds of information
|
121
|
-
it would had the user authenticated through an external provider.
|
122
|
-
Simple!
|
123
|
-
|
124
|
-
## Custom Auth Model
|
125
|
-
|
126
|
-
To use a class other than the default, specify the <tt>:model</tt> option to a
|
127
|
-
different class.
|
128
|
-
|
129
|
-
```ruby
|
130
|
-
use OmniAuth::Builder do
|
131
|
-
provider :identity, :fields => [:email], :model => MyCustomClass
|
132
|
-
end
|
133
|
-
```
|
134
|
-
|
135
|
-
## Customizing Registration Failure
|
136
|
-
|
137
|
-
To use your own custom registration form, create a form that POSTs to
|
138
|
-
'/auth/identity/register' with 'password', 'password_confirmation', and your
|
139
|
-
other fields.
|
140
|
-
|
141
|
-
```erb
|
142
|
-
<%= form_tag '/auth/identity/register' do |f| %>
|
143
|
-
<h1>Create an Account</h1>
|
144
|
-
<%= text_field_tag :email %>
|
145
|
-
<%= password_field_tag :password %>
|
146
|
-
<%= password_field_tag :password_confirmation %>
|
147
|
-
<%= submit_tag %>
|
148
|
-
<% end %>
|
149
|
-
```
|
150
|
-
|
151
|
-
Beware not to nest your form parameters within a namespace. This strategy
|
152
|
-
looks for the form parameters at the top level of the post params. If you are
|
153
|
-
using [simple\_form](https://github.com/plataformatec/simple_form), then you
|
154
|
-
can avoid the params nesting by specifying <tt>:input_html</tt>.
|
155
|
-
|
156
|
-
```erb
|
157
|
-
<%= simple_form_for @identity, :url => '/auth/identity/register' do |f| %>
|
158
|
-
<h1>Create an Account</h1>
|
159
|
-
<%# specify :input_html to avoid params nesting %>
|
160
|
-
<%= f.input :email, :input_html => {:name => 'email'} %>
|
161
|
-
<%= f.input :password, :as => 'password', :input_html => {:name => 'password'} %>
|
162
|
-
<%= f.input :password_confirmation, :label => "Confirm Password", :as => 'password', :input_html => {:name => 'password_confirmation'} %>
|
163
|
-
<button type='submit'>Sign Up</button>
|
164
|
-
<% end %>
|
165
|
-
```
|
166
|
-
|
167
|
-
Next you'll need to let OmniAuth know what action to call when a registration
|
168
|
-
fails. In your OmniAuth configuration, specify any valid rack endpoint in the
|
169
|
-
<tt>:on_failed_registration</tt> option.
|
170
|
-
|
171
|
-
```ruby
|
172
|
-
use OmniAuth::Builder do
|
173
|
-
provider :identity,
|
174
|
-
:fields => [:email],
|
175
|
-
:on_failed_registration => UsersController.action(:new)
|
176
|
-
end
|
177
|
-
```
|
178
|
-
|
179
|
-
For more information on rack endpoints, check out [this
|
180
|
-
introduction](http://library.edgecase.com/Rails/2011/01/04/rails-routing-and-rack-endpoints.html)
|
181
|
-
and
|
182
|
-
[ActionController::Metal](http://rubydoc.info/docs/rails/ActionController/Metal)
|
183
|
-
|
184
|
-
## Customizing Locate Conditions
|
185
|
-
|
186
|
-
You can customize the way that matching records are found when authenticating.
|
187
|
-
For example, for a site with multiple domains, you may wish to scope the search
|
188
|
-
within a particular subdomain. To do so, add :locate_conditions to your config.
|
189
|
-
The default value is:
|
190
|
-
|
191
|
-
```ruby
|
192
|
-
:locate_conditions => lambda { |req| { model.auth_key => req['auth_key']} }
|
193
|
-
```
|
194
|
-
|
195
|
-
locate_conditions takes a Proc object, and must return a hash. The resulting hash is used
|
196
|
-
as a parameter in the locate method for your ORM. The proc is evaluated in the
|
197
|
-
callback context, and has access to the Identity model (using `model`) and receives the request
|
198
|
-
object as a parameter. Note that model.auth_key defaults to 'email', but is also configurable.
|
199
|
-
|
200
|
-
Note: Be careful when customizing locate_conditions. The best way to modify the conditions is
|
201
|
-
to copy the default value, and then add to the hash. Removing the default condition will almost
|
202
|
-
always break things!
|
data/Rakefile
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'dm-core'
|
2
|
-
require 'dm-validations'
|
3
|
-
|
4
|
-
module OmniAuth
|
5
|
-
module Identity
|
6
|
-
module Models
|
7
|
-
module DataMapper
|
8
|
-
def self.included(base)
|
9
|
-
base.class_eval do
|
10
|
-
include OmniAuth::Identity::Model
|
11
|
-
include OmniAuth::Identity::SecurePassword
|
12
|
-
|
13
|
-
# http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F
|
14
|
-
# http://rubydoc.info/github/mongoid/mongoid/master/Mongoid/State#persisted%3F-instance_method
|
15
|
-
alias persisted? valid?
|
16
|
-
|
17
|
-
has_secure_password
|
18
|
-
|
19
|
-
def self.auth_key=(key)
|
20
|
-
super
|
21
|
-
validates_uniqueness_of :key
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.locate(search_hash)
|
25
|
-
all(search_hash).first
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end # DataMapper
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
data/omniauth-identity.gemspec
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
require File.dirname(__FILE__) + '/lib/omniauth-identity/version'
|
3
|
-
|
4
|
-
Gem::Specification.new do |gem|
|
5
|
-
gem.add_runtime_dependency 'omniauth', '~> 1.0'
|
6
|
-
gem.add_runtime_dependency 'bcrypt-ruby', '~> 3.0'
|
7
|
-
|
8
|
-
gem.add_development_dependency 'maruku', '~> 0.6'
|
9
|
-
gem.add_development_dependency 'simplecov', '~> 0.4'
|
10
|
-
gem.add_development_dependency 'rack-test', '~> 0.5'
|
11
|
-
gem.add_development_dependency 'rake', '~> 0.8'
|
12
|
-
gem.add_development_dependency 'rspec', '~> 2.7'
|
13
|
-
gem.add_development_dependency 'activerecord', '~> 3.1'
|
14
|
-
gem.add_development_dependency 'mongoid'
|
15
|
-
gem.add_development_dependency 'mongo_mapper'
|
16
|
-
gem.add_development_dependency 'datamapper'
|
17
|
-
gem.add_development_dependency 'bson_ext'
|
18
|
-
gem.add_development_dependency 'couch_potato'
|
19
|
-
|
20
|
-
gem.name = 'omniauth-identity'
|
21
|
-
gem.version = OmniAuth::Identity::VERSION
|
22
|
-
gem.description = %q{Internal authentication handlers for OmniAuth.}
|
23
|
-
gem.summary = gem.description
|
24
|
-
gem.email = ['michael@intridea.com']
|
25
|
-
gem.homepage = 'http://github.com/intridea/omniauth-identity'
|
26
|
-
gem.authors = ['Michael Bleigh']
|
27
|
-
gem.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
|
28
|
-
gem.files = `git ls-files`.split("\n")
|
29
|
-
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
30
|
-
gem.require_paths = ['lib']
|
31
|
-
gem.required_rubygems_version = Gem::Requirement.new('>= 1.3.6') if gem.respond_to? :required_rubygems_version=
|
32
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe(OmniAuth::Identity::Models::DataMapper, :db => true) do
|
4
|
-
class DataMapperTestIdentity
|
5
|
-
include DataMapper::Resource
|
6
|
-
include OmniAuth::Identity::Models::DataMapper
|
7
|
-
|
8
|
-
property :id, Serial
|
9
|
-
auth_key :ham_sandwich
|
10
|
-
end
|
11
|
-
|
12
|
-
DataMapper.finalize
|
13
|
-
|
14
|
-
before :all do
|
15
|
-
@resource = DataMapperTestIdentity.new
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'should delegate locate to the all query method' do
|
19
|
-
DataMapperTestIdentity.should_receive(:all).with('ham_sandwich' => 'open faced', 'category' => 'sandwiches').and_return(['wakka'])
|
20
|
-
DataMapperTestIdentity.locate('ham_sandwich' => 'open faced', 'category' => 'sandwiches').should == 'wakka'
|
21
|
-
end
|
22
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe(OmniAuth::Identity::Models::MongoMapper, :db => true) do
|
4
|
-
class MongoMapperTestIdentity
|
5
|
-
include MongoMapper::Document
|
6
|
-
include OmniAuth::Identity::Models::MongoMapper
|
7
|
-
auth_key :ham_sandwich
|
8
|
-
end
|
9
|
-
|
10
|
-
|
11
|
-
it 'should delegate locate to the where query method' do
|
12
|
-
MongoMapperTestIdentity.should_receive(:where).with('ham_sandwich' => 'open faced', 'category' => 'sandwiches').and_return(['wakka'])
|
13
|
-
MongoMapperTestIdentity.locate('ham_sandwich' => 'open faced', 'category' => 'sandwiches').should == 'wakka'
|
14
|
-
end
|
15
|
-
end
|