omniauth-identity 3.0.0 → 3.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f6fae0f25aadccc74594334c90cf581c141a7fb68cbe50f26638648aa0fbbe4
4
- data.tar.gz: 6998b461e27a72cc4da0cd4ca80f63e284fbf9fbff466b40ec1df736e511516d
3
+ metadata.gz: e486fff1d58be9ad944402aa2952bfceca493c6e78f1ba8c1e29cf6142543b01
4
+ data.tar.gz: a4be9557b902ff9dfe779baea964477aaf127519f8e389b82aa3cd83af3041da
5
5
  SHA512:
6
- metadata.gz: e209c51695fef0b79d0b57360acb1f9dc464a0424f96e1ab87b9847c0de7350c677a057c7cedb7e587428465c6fb8eaefb53a644fae18b5a9c574d82a0fdaf86
7
- data.tar.gz: 542dd3902564af08c6c6653b381ce545278ef759e0b0861df62a8e19a118cabf022143db267c81525a26e944679770f8e8b62c1a4f93282c55505bcc56442dd4
6
+ metadata.gz: 3f4d5a82e3ee782716992b1183cac66e6a29cee8037a8491a56bb8dd832ee9f22946eee7900d9e1d8d20d9bc5dcce3336652f25f606f027e87d79be6a9a00c6d
7
+ data.tar.gz: f2de6f02475fe119947bd6ba2f66e9585664b522833180e5327fcda8aa3b92c8fcb95d3bfb6baf45724851c1dd6c2a8144fe473f70715c6399b8025d73b195b2
data/CHANGELOG.md CHANGED
@@ -8,22 +8,84 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [3.0.5] - 2021-03-19
12
+
13
+ ### Fixed
14
+
15
+ - Fix breaking changes introduced by [#86's](https://github.com/omniauth/omniauth-identity/pull/86) introduction of `:on_validation`
16
+
17
+ ### Added
18
+
19
+ - Define `#save`, `#persisted?` and `::create` on `Omniauth::Identity::Model`
20
+ - Add `@since` YARD tags to interface methods
21
+ - Refactor `Omniauth::Strategies::Identity.registration_phase` to support `Omniauth::Identity::Model`-inheriting classes that do not define `#save`.
22
+ - This support will be dropped in v4.0.
23
+
24
+ ## [3.0.4] - 2021-02-14
25
+
26
+ ### Added
27
+
28
+ - Add support for [sequel ORM](http://sequel.jeremyevans.net/)
29
+
30
+ ## [3.0.3] - 2021-02-14
31
+
32
+ ### Added
33
+
34
+ - Add option `:on_validation`, which can be used to add a Captcha
35
+ - See [example here](https://github.com/omniauth/omniauth-identity/pull/86#issue-63225122)
36
+ - Add support for nobrainer, an ORM for RethinkDB
37
+ - Validation error message on invalid registration form submission
38
+
39
+ ### Removed
40
+
41
+ - ruby-head build... simply too slow
42
+
43
+ ## [3.0.2] - 2021-02-14
44
+
45
+ ### Fixed
46
+
47
+ - Github Actions CI Build for Ruby 2.4, 3.0 and ruby-head
48
+ - Updated copyright
49
+ - Code style cleanup
50
+ - Added Code Climate "Quality"
51
+ - Updated Readme
52
+
53
+ ## [3.0.1] - 2021-02-14
54
+
55
+ ### Fixed
56
+
57
+ - Github Actions CI Build for various Rubies
58
+
59
+ ## [3.0] - 2021-02-13
60
+
11
61
  ### Added
62
+
63
+ - Compatibility with Ruby 3
12
64
  - Add option `:enable_login` to bypass OmniAuth disabling of GET method (default `true`)
13
65
  - NOTE: This restores compatibility between this gem and the current, core, omniauth gem!
14
66
  - README updates, including a rename to README.md
67
+ - CODE_OF_CONDUCT.md using v2
68
+ - Rubocop
69
+ - Github Actions for Continuous Integration
70
+ - Minimum Ruby version = 2.4
71
+ - Automatically adds "provider" => "identity" when "provider" column is detected
72
+ - Documentation in README.md
15
73
 
16
74
  ### Removed
17
- - Removed support for DataMapper, which died long ago.
18
- - Cleanup (removal) of unwanted git artifacts
75
+
76
+ - Support for Rubies < 2.4
77
+ - Support for DataMapper, which died long ago.
78
+ - Unwanted git artifacts
19
79
 
20
80
  ## [2.0] - 2020-09-01
21
81
 
22
82
  ### Added
83
+
23
84
  - CHANGELOG to maintain a history of changes.
24
85
  - Include mongoid-rspec gem.
25
86
 
26
87
  ### Changed
88
+
27
89
  - Fix failing Specs
28
90
  - Update Spec syntax to RSpec 3
29
91
  - Fix deprecation Warnings
data/LICENSE CHANGED
@@ -1,4 +1,5 @@
1
- Copyright (c) 2020- Andrew Roberts, and Jellybooks Ltd.
1
+ Copyright (c) 2021 OmniAuth-Identity Maintainers
2
+ Copyright (c) 2020 Peter Boling, Andrew Roberts, and Jellybooks Ltd.
2
3
  Copyright (c) 2010-2015 Michael Bleigh and Intridea, Inc.
3
4
 
4
5
  Permission is hereby granted, free of charge, to any person obtaining
data/README.md CHANGED
@@ -1,16 +1,26 @@
1
1
  # OmniAuth Identity
2
2
 
3
+ [![Version](https://img.shields.io/gem/v/omniauth-identity.svg)](https://rubygems.org/gems/omniauth-identity)
4
+ [![Depfu](https://badges.depfu.com/badges/6c9b45362951b872127f9e46d39bed76/count.svg)](https://depfu.com/github/omniauth/omniauth-identity?project_id=22381)
5
+ [![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Fomniauth%2Fomniauth-identity%2Fbadge&style=flat)](https://actions-badge.atrox.dev/omniauth/omniauth-identity/goto)
6
+ [![Maintainability](https://api.codeclimate.com/v1/badges/621d6211cb2e0959ce00/maintainability)](https://codeclimate.com/github/omniauth/omniauth-identity/maintainability)
7
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/621d6211cb2e0959ce00/test_coverage)](https://codeclimate.com/github/omniauth/omniauth-identity/test_coverage)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
9
+ [![Open Source Helpers](https://www.codetriage.com/omniauth/omniauth-identity/badges/users.svg)](https://www.codetriage.com/omniauth/omniauth-identity)
10
+ [![Downloads Rank](https://img.shields.io/gem/rd/omniauth-identity.svg)](https://rubygems.org/gems/omniauth-identity)
11
+
3
12
  The OmniAuth Identity gem provides a way for applications to utilize a
4
- traditional login/password based authentication system without the need
13
+ traditional username/password based authentication system without the need
5
14
  to give up the simple authentication flow provided by OmniAuth. Identity
6
15
  is designed on purpose to be as featureless as possible: it provides the
7
16
  basic construct for user management and then gets out of the way.
8
17
 
9
18
  ## Compatibility
10
19
 
11
- This gem is compatible with, as of Feb 2021:
12
- • latest released version of omniauth, v2.0.2
13
- Ruby 2.4, 2.5, 2.6, 2.7
20
+ This gem is compatible with, as of Feb 2021, version 3:
21
+
22
+ * Latest released version of omniauth, v2.0.2
23
+ * Ruby 2.4, 2.5, 2.6, 2.7, 3.0, ruby-head
14
24
 
15
25
  ## Installation
16
26
 
@@ -48,6 +58,13 @@ with `:model` argument above) that will be able to persist the information
48
58
  provided by the user. Luckily for you, there are pre-built models for popular
49
59
  ORMs that make this dead simple.
50
60
 
61
+ Once you've got an `Identity` persistence model and the strategy up and
62
+ running, you can point users to `/auth/identity` and it will request
63
+ that they log in or give them the opportunity to sign up for an account.
64
+ Once they have authenticated with their identity, OmniAuth will call
65
+ through to `/auth/identity/callback` with the same kinds of information
66
+ it would had the user authenticated through an external provider.
67
+
51
68
  **Note:** OmniAuth Identity is different from many other user authentication
52
69
  systems in that it is *not* built to store authentication information in your primary
53
70
  `User` model. Instead, the `Identity` model should be **associated** with your
@@ -68,52 +85,42 @@ class Identity < OmniAuth::Identity::Models::ActiveRecord
68
85
  end
69
86
  ```
70
87
 
71
- ### Mongoid
88
+ ### Sequel
72
89
 
73
- Include the `OmniAuth::Identity::Models::Mongoid` mixin and specify
74
- fields that you will need.
90
+ [Sequel](http://sequel.jeremyevans.net/) is an alternative to ActiveRecord.
75
91
 
76
- ```ruby
77
- class Identity
78
- include Mongoid::Document
79
- include OmniAuth::Identity::Models::Mongoid
92
+ Just include `OmniAuth::Identity::Models::Sequel` mixin, and specify
93
+ whatever else you will need.
80
94
 
81
- field :email, type: String
82
- field :name, type: String
83
- field :password_digest, type: String
95
+ ```ruby
96
+ class SequelTestIdentity < Sequel::Model
97
+ include OmniAuth::Identity::Models::Sequel
98
+ auth_key :email
99
+ # whatever else you want!
84
100
  end
85
101
  ```
86
102
 
87
- ### MongoMapper
88
-
89
- Unfortunately MongoMapper is **not supported** in `omniauth-identity` from >= v2.0 as a result of it
90
- not being maintained for several years.
91
103
 
92
- It wasn't possible to include Mongoid *and* MongoMapper due to incompatible gem version
93
- requirements. Therefore precedence was given to Mongoid as it is significantly more
94
- popular and actively maintained.
95
-
96
- ### DataMapper
104
+ ### Mongoid
97
105
 
98
- Include the `OmniAuth::Identity::Models::DataMapper` mixin and specify
106
+ Include the `OmniAuth::Identity::Models::Mongoid` mixin and specify
99
107
  fields that you will need.
100
108
 
101
109
  ```ruby
102
110
  class Identity
103
- include DataMapper::Resource
104
- include OmniAuth::Identity::Models::DataMapper
105
-
106
- property :id, Serial
107
- property :email, String
108
- property :password_digest, Text
111
+ include Mongoid::Document
112
+ include OmniAuth::Identity::Models::Mongoid
109
113
 
110
- attr_accessor :password_confirmation
114
+ field :email, type: String
115
+ field :name, type: String
116
+ field :password_digest, type: String
111
117
  end
112
118
  ```
113
119
 
114
120
  ### CouchPotato
115
121
 
116
- Include the `OmniAuth::Identity::Models::CouchPotatoModule` mixin and specify fields that you will need.
122
+ Include the `OmniAuth::Identity::Models::CouchPotatoModule` mixin and specify
123
+ fields that you will need.
117
124
 
118
125
  ```ruby
119
126
  class Identity
@@ -131,13 +138,25 @@ class Identity
131
138
  end
132
139
  ```
133
140
 
134
- Once you've got an `Identity` persistence model and the strategy up and
135
- running, you can point users to `/auth/identity` and it will request
136
- that they log in or give them the opportunity to sign up for an account.
137
- Once they have authenticated with their identity, OmniAuth will call
138
- through to `/auth/identity/callback` with the same kinds of information
139
- it would had the user authenticated through an external provider.
140
- Simple!
141
+ ### NoBrainer
142
+
143
+ [NoBrainer](http://nobrainer.io/) is an ORM for [RethinkDB](https://rethinkdb.com/).
144
+
145
+ Include the `OmniAuth::Identity::Models::NoBrainer` mixin and specify
146
+ fields that you will need.
147
+
148
+ ```ruby
149
+ class Identity
150
+ include NoBrainer::Document
151
+ include OmniAuth::Identity::Models::NoBrainer
152
+
153
+ auth_key :email
154
+ end
155
+ ```
156
+
157
+ ### Ruby Object Mapper
158
+
159
+ Would love to add a mixin for the [Ruby Object Mapper (ROM)](https://rom-rb.org/) if anyone wants to work on it!
141
160
 
142
161
  ## Custom Auth Model
143
162
 
@@ -226,12 +245,32 @@ Note: Be careful when customizing `locate_conditions`. The best way to modify t
226
245
  to copy the default value, and then add to the hash. Removing the default condition will almost
227
246
  always break things!
228
247
 
248
+ ## Customizing Other Things
249
+
250
+ From the code - here are the options we have for you, a couple of which are documented above, and the rest are documented... in the specs we hope!?
251
+ ```
252
+ option :fields, %i[name email]
253
+
254
+ # Primary Feature Switches:
255
+ option :enable_registration, true # See #other_phase and #request_phase
256
+ option :enable_login, true # See #other_phase
257
+
258
+ # Customization Options:
259
+ option :on_login, nil # See #request_phase
260
+ option :on_validation, nil # See #registration_phase
261
+ option :on_registration, nil # See #registration_phase
262
+ option :on_failed_registration, nil # See #registration_phase
263
+ option :locate_conditions, ->(req) { { model.auth_key => req['auth_key'] } }
264
+ ```
265
+
266
+ Please contribute some documentation if you have the gumption! The maintainer's time is limited, and sometimes the authors of PRs with new options don't update the _this_ readme. 😭
267
+
229
268
  ## License
230
269
 
231
270
  MIT License. See LICENSE for details.
232
271
 
233
272
  ## Copyright
234
273
 
235
- Copyright (c) 2021 OmniAuth-Identity Maintainers
236
- Copyright (c) 2020 Peter Boling, Andrew Roberts, and Jellybooks Ltd.
237
- Copyright (c) 2010-2015 Michael Bleigh, and Intridea, Inc.
274
+ * Copyright (c) 2021 OmniAuth-Identity Maintainers
275
+ * Copyright (c) 2020 Peter Boling, Andrew Roberts, and Jellybooks Ltd.
276
+ * Copyright (c) 2010-2015 Michael Bleigh, and Intridea, Inc.
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'omniauth-identity/version'
2
4
  require 'omniauth/identity'
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OmniAuth
2
4
  module Identity
3
- VERSION = '3.0.0'
5
+ VERSION = '3.0.5'
4
6
  end
5
7
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'omniauth'
2
4
 
3
5
  module OmniAuth
@@ -12,6 +14,8 @@ module OmniAuth
12
14
  autoload :ActiveRecord, 'omniauth/identity/models/active_record'
13
15
  autoload :Mongoid, 'omniauth/identity/models/mongoid'
14
16
  autoload :CouchPotatoModule, 'omniauth/identity/models/couch_potato'
17
+ autoload :NoBrainer, 'omniauth/identity/models/no_brainer'
18
+ autoload :Sequel, 'omniauth/identity/models/sequel'
15
19
  end
16
20
  end
17
21
  end
@@ -1,24 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OmniAuth
2
4
  module Identity
3
5
  # This module provides an includable interface for implementing the
4
6
  # necessary API for OmniAuth Identity to properly locate identities
5
- # and provide all necessary information. All methods marked as
6
- # abstract must be implemented in the including class for things to
7
- # work properly.
7
+ # and provide all necessary information.
8
+ #
9
+ # All methods marked as abstract must be implemented in the
10
+ # including class for things to work properly.
11
+ #
12
+ ### Singleton API
13
+ #
14
+ # * locate(key)
15
+ # * create(*args) - Deprecated in v3.0.5; Will be removed in v4.0
16
+ #
17
+ ### Instance API
18
+ #
19
+ # * save
20
+ # * persisted?
21
+ # * authenticate(password)
22
+ #
8
23
  module Model
24
+ SCHEMA_ATTRIBUTES = %w[name email nickname first_name last_name location description image phone].freeze
25
+
9
26
  def self.included(base)
10
27
  base.extend ClassMethods
11
28
  end
12
29
 
13
30
  module ClassMethods
14
- # Locate an identity given its unique login key.
15
- #
16
- # @abstract
17
- # @param [String] key The unique login key.
18
- # @return [Model] An instance of the identity model class.
19
- def locate(key)
20
- raise NotImplementedError
21
- end
31
+ extend Gem::Deprecate
22
32
 
23
33
  # Authenticate a user with the given key and password.
24
34
  #
@@ -37,10 +47,57 @@ module OmniAuth
37
47
  # @return [String] The method name.
38
48
  def auth_key(method = false)
39
49
  @auth_key = method.to_s unless method == false
40
- @auth_key = nil if @auth_key == ''
50
+ @auth_key = nil if !defined?(@auth_key) || @auth_key == ''
41
51
 
42
52
  @auth_key || 'email'
43
53
  end
54
+
55
+ # Persists a new Identity object to the ORM.
56
+ # Defaults to calling super. Override as needed per ORM.
57
+ #
58
+ # @deprecated v4.0 will begin using {#new} with {#save} instead.
59
+ # @abstract
60
+ # @param [Hash] args Attributes of the new instance.
61
+ # @return [Model] An instance of the identity model class.
62
+ # @since 3.0.5
63
+ def create(*args)
64
+ raise NotImplementedError unless defined?(super)
65
+
66
+ super
67
+ end
68
+
69
+ # Locate an identity given its unique login key.
70
+ #
71
+ # @abstract
72
+ # @param [String] key The unique login key.
73
+ # @return [Model] An instance of the identity model class.
74
+ def locate(key)
75
+ raise NotImplementedError
76
+ end
77
+ end
78
+
79
+ # Persists a new Identity object to the ORM.
80
+ # Default raises an error. Override as needed per ORM.
81
+ #
82
+ # @abstract
83
+ # @return [Model] An instance of the identity model class.
84
+ # @since 3.0.5
85
+ def save
86
+ raise NotImplementedError unless defined?(super)
87
+
88
+ super
89
+ end
90
+
91
+ # Checks if the Identity object is persisted in the ORM.
92
+ # Defaults to calling super. Override as needed per ORM.
93
+ #
94
+ # @abstract
95
+ # @return [true or false] true if object exists, false if not.
96
+ # @since 3.0.5
97
+ def persisted?
98
+ raise NotImplementedError unless defined?(super)
99
+
100
+ super
44
101
  end
45
102
 
46
103
  # Returns self if the provided password is correct, false
@@ -53,22 +110,6 @@ module OmniAuth
53
110
  raise NotImplementedError
54
111
  end
55
112
 
56
- SCHEMA_ATTRIBUTES = %w[name email nickname first_name last_name location description image phone]
57
- # A hash of as much of the standard OmniAuth schema as is stored
58
- # in this particular model. By default, this will call instance
59
- # methods for each of the attributes it needs in turn, ignoring
60
- # any for which `#respond_to?` is `false`.
61
- #
62
- # If `first_name`, `nickname`, and/or `last_name` is provided but
63
- # `name` is not, it will be automatically calculated.
64
- #
65
- # @return [Hash] A string-keyed hash of user information.
66
- def info
67
- SCHEMA_ATTRIBUTES.each_with_object({}) do |attribute, hash|
68
- hash[attribute] = send(attribute) if respond_to?(attribute)
69
- end
70
- end
71
-
72
113
  # An identifying string that must be globally unique to the
73
114
  # application. Defaults to stringifying the `id` method.
74
115
  #
@@ -104,13 +145,28 @@ module OmniAuth
104
145
  # @param [String] value The value to which the auth key should be
105
146
  # set.
106
147
  def auth_key=(value)
107
- auth_key_setter = (self.class.auth_key + '=').to_sym
148
+ auth_key_setter = "#{self.class.auth_key}=".to_sym
108
149
  if respond_to?(auth_key_setter)
109
150
  send(auth_key_setter, value)
110
151
  else
111
152
  raise NotImplementedError
112
153
  end
113
154
  end
155
+
156
+ # A hash of as much of the standard OmniAuth schema as is stored
157
+ # in this particular model. By default, this will call instance
158
+ # methods for each of the attributes it needs in turn, ignoring
159
+ # any for which `#respond_to?` is `false`.
160
+ #
161
+ # If `first_name`, `nickname`, and/or `last_name` is provided but
162
+ # `name` is not, it will be automatically calculated.
163
+ #
164
+ # @return [Hash] A string-keyed hash of user information.
165
+ def info
166
+ SCHEMA_ATTRIBUTES.each_with_object({}) do |attribute, hash|
167
+ hash[attribute] = send(attribute) if respond_to?(attribute)
168
+ end
169
+ end
114
170
  end
115
171
  end
116
172
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_record'
2
4
 
3
5
  module OmniAuth
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'couch_potato'
2
4
 
3
5
  module OmniAuth
4
6
  module Identity
5
7
  module Models
6
8
  # can not be named CouchPotato since there is a class with that name
9
+ # NOTE: CouchPotato is based on ActiveModel.
7
10
  module CouchPotatoModule
8
11
  def self.included(base)
9
12
  base.class_eval do
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mongoid'
2
4
 
3
5
  module OmniAuth
4
6
  module Identity
5
7
  module Models
8
+ # NOTE: Mongoid is based on ActiveModel.
6
9
  module Mongoid
7
10
  def self.included(base)
8
11
  base.class_eval do
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nobrainer'
4
+
5
+ module OmniAuth
6
+ module Identity
7
+ module Models
8
+ # http://nobrainer.io/ an ORM for RethinkDB
9
+ # NOTE: NoBrainer is based on ActiveModel.
10
+ module NoBrainer
11
+ def self.included(base)
12
+ base.class_eval do
13
+ include ::OmniAuth::Identity::Model
14
+ include ::OmniAuth::Identity::SecurePassword
15
+
16
+ has_secure_password
17
+
18
+ def self.auth_key=(key)
19
+ super
20
+ validates_uniqueness_of key, case_sensitive: false
21
+ end
22
+
23
+ def self.locate(search_hash)
24
+ where(search_hash).first
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nobrainer'
4
+
5
+ module OmniAuth
6
+ module Identity
7
+ module Models
8
+ # http://sequel.jeremyevans.net/ an SQL ORM
9
+ # NOTE: Sequel is *not* based on ActiveModel, but supports the API we need, except for `persisted`:
10
+ # * create
11
+ # * save, but save is deprecated in favor of `save_changes`
12
+ module Sequel
13
+ def self.included(base)
14
+ base.class_eval do
15
+ # NOTE: Using the deprecated :validations_class_methods because it defines
16
+ # validates_confirmation_of, while current :validation_helpers does not.
17
+ # plugin :validation_helpers
18
+ plugin :validation_class_methods
19
+
20
+ include OmniAuth::Identity::Model
21
+ include ::OmniAuth::Identity::SecurePassword
22
+
23
+ has_secure_password
24
+
25
+ alias_method :persisted?, :valid?
26
+
27
+ def self.auth_key=(key)
28
+ super
29
+ validates_uniqueness_of :key, case_sensitive: false
30
+ end
31
+
32
+ def self.locate(search_hash)
33
+ where(search_hash).first
34
+ end
35
+
36
+ def persisted?
37
+ exists?
38
+ end
39
+
40
+ def save
41
+ save_changes
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bcrypt'
2
4
 
3
5
  module OmniAuth
@@ -1,33 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OmniAuth
2
4
  module Strategies
3
5
  # The identity strategy allows you to provide simple internal
4
6
  # user authentication using the same process flow that you
5
7
  # use for external OmniAuth providers.
6
8
  class Identity
9
+ DEFAULT_REGISTRATION_FIELDS = %i[password password_confirmation].freeze
7
10
  include OmniAuth::Strategy
8
-
9
11
  option :fields, %i[name email]
10
- option :enable_login, true # See #other_phase documentation
11
- option :on_login, nil
12
- option :on_registration, nil
13
- option :on_failed_registration, nil
14
- option :enable_registration, true
12
+
13
+ # Primary Feature Switches:
14
+ option :enable_registration, true # See #other_phase and #request_phase
15
+ option :enable_login, true # See #other_phase
16
+
17
+ # Customization Options:
18
+ option :on_login, nil # See #request_phase
19
+ option :on_validation, nil # See #registration_phase
20
+ option :on_registration, nil # See #registration_phase
21
+ option :on_failed_registration, nil # See #registration_phase
15
22
  option :locate_conditions, ->(req) { { model.auth_key => req['auth_key'] } }
16
23
 
17
24
  def request_phase
18
25
  if options[:on_login]
19
26
  options[:on_login].call(env)
20
27
  else
21
- OmniAuth::Form.build(
22
- title: (options[:title] || 'Identity Verification'),
23
- url: callback_path
24
- ) do |f|
25
- f.text_field 'Login', 'auth_key'
26
- f.password_field 'Password', 'password'
27
- if options[:enable_registration]
28
- f.html "<p align='center'><a href='#{registration_path}'>Create an Identity</a></p>"
29
- end
30
- end.to_response
28
+ build_omniauth_login_form.to_response
31
29
  end
32
30
  end
33
31
 
@@ -58,36 +56,32 @@ module OmniAuth
58
56
  end
59
57
  end
60
58
 
61
- def registration_form
59
+ def registration_form(validation_message = nil)
62
60
  if options[:on_registration]
63
61
  options[:on_registration].call(env)
64
62
  else
65
- OmniAuth::Form.build(title: 'Register Identity') do |f|
66
- options[:fields].each do |field|
67
- f.text_field field.to_s.capitalize, field.to_s
68
- end
69
- f.password_field 'Password', 'password'
70
- f.password_field 'Confirm Password', 'password_confirmation'
71
- end.to_response
63
+ build_omniauth_registration_form(validation_message).to_response
72
64
  end
73
65
  end
74
66
 
75
67
  def registration_phase
76
- attributes = (options[:fields] + %i[password password_confirmation]).each_with_object({}) do |k, h|
68
+ attributes = (options[:fields] + DEFAULT_REGISTRATION_FIELDS).each_with_object({}) do |k, h|
77
69
  h[k] = request[k.to_s]
78
70
  end
79
71
  if model.respond_to?(:column_names) && model.column_names.include?('provider')
80
72
  attributes.reverse_merge!(provider: 'identity')
81
73
  end
82
- @identity = model.create(attributes)
83
- if @identity.persisted?
84
- env['PATH_INFO'] = callback_path
85
- callback_phase
86
- elsif options[:on_failed_registration]
74
+ if saving_instead_of_creating?
75
+ @identity = model.new(attributes)
87
76
  env['omniauth.identity'] = @identity
88
- options[:on_failed_registration].call(env)
77
+ if !validating? || valid?
78
+ @identity.save
79
+ registration_result
80
+ else
81
+ registration_failure('Validation failed')
82
+ end
89
83
  else
90
- registration_form
84
+ deprecated_registration(attributes)
91
85
  end
92
86
  end
93
87
 
@@ -115,6 +109,80 @@ module OmniAuth
115
109
  def model
116
110
  options[:model] || ::Identity
117
111
  end
112
+
113
+ private
114
+
115
+ def build_omniauth_login_form
116
+ OmniAuth::Form.build(
117
+ title: (options[:title] || 'Identity Verification'),
118
+ url: callback_path
119
+ ) do |f|
120
+ f.text_field 'Login', 'auth_key'
121
+ f.password_field 'Password', 'password'
122
+ if options[:enable_registration]
123
+ f.html "<p align='center'><a href='#{registration_path}'>Create an Identity</a></p>"
124
+ end
125
+ end
126
+ end
127
+
128
+ def build_omniauth_registration_form(validation_message)
129
+ OmniAuth::Form.build(title: 'Register Identity') do |f|
130
+ f.html "<p style='color:red'>#{validation_message}</p>" if validation_message
131
+ options[:fields].each do |field|
132
+ f.text_field field.to_s.capitalize, field.to_s
133
+ end
134
+ f.password_field 'Password', 'password'
135
+ f.password_field 'Confirm Password', 'password_confirmation'
136
+ end
137
+ end
138
+
139
+ def saving_instead_of_creating?
140
+ model.respond_to?(:save) && model.respond_to?(:persisted?)
141
+ end
142
+
143
+ # Validates the model before it is persisted
144
+ #
145
+ # @return [truthy or falsey] :on_validation option is truthy or falsey
146
+ def validating?
147
+ options[:on_validation]
148
+ end
149
+
150
+ # Validates the model before it is persisted
151
+ #
152
+ # @return [true or false] result of :on_validation call
153
+ def valid?
154
+ # on_validation may run a Captcha or other validation mechanism
155
+ # Must return true when validation passes, false otherwise
156
+ !!options[:on_validation].call(env: env)
157
+ end
158
+
159
+ def registration_failure(message)
160
+ if options[:on_failed_registration]
161
+ options[:on_failed_registration].call(env)
162
+ else
163
+ registration_form(message)
164
+ end
165
+ end
166
+
167
+ def registration_result
168
+ if @identity.persisted?
169
+ env['PATH_INFO'] = callback_path
170
+ callback_phase
171
+ else
172
+ registration_failure('One or more fields were invalid')
173
+ end
174
+ end
175
+
176
+ def deprecated_registration(attributes)
177
+ warn <<~CREATEDEP
178
+ [DEPRECATION] Please define '#{model.class}#save'.
179
+ Behavior based on '#{model.class}.create' will be removed in omniauth-identity v4.0.
180
+ See lib/omniauth/identity/model.rb
181
+ CREATEDEP
182
+ @identity = model.create(attributes)
183
+ env['omniauth.identity'] = @identity
184
+ registration_result
185
+ end
118
186
  end
119
187
  end
120
188
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ExampleModel
2
4
  include OmniAuth::Identity::Model
3
5
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe(OmniAuth::Identity::Models::ActiveRecord, db: true) do
2
4
  describe 'model', type: :model do
3
5
  subject(:model_klass) do
4
6
  AnonymousActiveRecord.generate(
5
7
  parent_klass: 'OmniAuth::Identity::Models::ActiveRecord',
6
- columns: %w[name provider],
8
+ columns: OmniAuth::Identity::Model::SCHEMA_ATTRIBUTES | %w[provider password_digest],
7
9
  connection_params: { adapter: 'sqlite3', encoding: 'utf8', database: ':memory:' }
8
10
  ) do
9
11
  def flower
@@ -1,10 +1,14 @@
1
- RSpec.describe(OmniAuth::Identity::Models::CouchPotatoModule, db: true) do
2
- class CouchPotatoTestIdentity
3
- include CouchPotato::Persistence
4
- include OmniAuth::Identity::Models::CouchPotatoModule
5
- auth_key :ham_sandwich
6
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'couch_potato'
7
4
 
5
+ class CouchPotatoTestIdentity
6
+ include CouchPotato::Persistence
7
+ include OmniAuth::Identity::Models::CouchPotatoModule
8
+ auth_key :ham_sandwich
9
+ end
10
+
11
+ RSpec.describe(OmniAuth::Identity::Models::CouchPotatoModule, db: true) do
8
12
  describe 'model', type: :model do
9
13
  subject { CouchPotatoTestIdentity }
10
14
 
@@ -1,11 +1,15 @@
1
- RSpec.describe(OmniAuth::Identity::Models::Mongoid, db: true) do
2
- class MongoidTestIdentity
3
- include Mongoid::Document
4
- include OmniAuth::Identity::Models::Mongoid
5
- auth_key :ham_sandwich
6
- store_in database: 'db1', collection: 'mongoid_test_identities', client: 'secondary'
7
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'mongoid'
8
4
 
5
+ class MongoidTestIdentity
6
+ include Mongoid::Document
7
+ include OmniAuth::Identity::Models::Mongoid
8
+ auth_key :ham_sandwich
9
+ store_in database: 'db1', collection: 'mongoid_test_identities', client: 'secondary'
10
+ end
11
+
12
+ RSpec.describe(OmniAuth::Identity::Models::Mongoid, db: true) do
9
13
  describe 'model', type: :model do
10
14
  subject { MongoidTestIdentity }
11
15
 
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nobrainer'
4
+
5
+ class NobrainerTestIdentity
6
+ include NoBrainer::Document
7
+ include OmniAuth::Identity::Models::NoBrainer
8
+ auth_key :ham_sandwich
9
+ end
10
+
11
+ RSpec.describe(OmniAuth::Identity::Models::NoBrainer, db: true) do
12
+ it 'delegates locate to the where query method' do
13
+ allow(NobrainerTestIdentity).to receive(:where).with('ham_sandwich' => 'open faced',
14
+ 'category' => 'sandwiches').and_return(['wakka'])
15
+ expect(NobrainerTestIdentity.locate('ham_sandwich' => 'open faced', 'category' => 'sandwiches')).to eq('wakka')
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sequel'
4
+ # Connect to an in-memory sqlite3 database.
5
+ DB = Sequel.sqlite
6
+ DB.create_table :sequel_test_identities do
7
+ primary_key :id
8
+ String :ham_sandwich, null: false
9
+ String :password_digest, null: false
10
+ end
11
+
12
+ class SequelTestIdentity < Sequel::Model
13
+ include OmniAuth::Identity::Models::Sequel
14
+ auth_key :ham_sandwich
15
+ end
16
+
17
+ RSpec.describe(OmniAuth::Identity::Models::Sequel, db: true) do
18
+ it 'delegates locate to the where query method' do
19
+ allow(SequelTestIdentity).to receive(:where).with('ham_sandwich' => 'open faced',
20
+ 'category' => 'sandwiches').and_return(['wakka'])
21
+ expect(SequelTestIdentity.locate('ham_sandwich' => 'open faced', 'category' => 'sandwiches')).to eq('wakka')
22
+ end
23
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class HasTheMethod
2
4
  def self.has_secure_password; end
3
5
  end
@@ -8,17 +10,17 @@ end
8
10
  RSpec.describe OmniAuth::Identity::SecurePassword do
9
11
  it 'extends with the class methods if it does not have the method' do
10
12
  expect(DoesNotHaveTheMethod).to receive(:extend).with(OmniAuth::Identity::SecurePassword::ClassMethods)
11
- DoesNotHaveTheMethod.include OmniAuth::Identity::SecurePassword
13
+ DoesNotHaveTheMethod.include described_class
12
14
  end
13
15
 
14
16
  it 'does not extend if the method is already defined' do
15
17
  expect(HasTheMethod).not_to receive(:extend)
16
- HasTheMethod.include OmniAuth::Identity::SecurePassword
18
+ HasTheMethod.include described_class
17
19
  end
18
20
 
19
21
  it 'responds to has_secure_password afterwards' do
20
22
  [HasTheMethod, DoesNotHaveTheMethod].each do |klass|
21
- klass.send(:include, OmniAuth::Identity::SecurePassword)
23
+ klass.send(:include, described_class)
22
24
  expect(klass).to be_respond_to(:has_secure_password)
23
25
  end
24
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe OmniAuth::Strategies::Identity do
2
4
  attr_accessor :app
3
5
 
@@ -6,7 +8,8 @@ RSpec.describe OmniAuth::Strategies::Identity do
6
8
  let(:identity_options) { {} }
7
9
  let(:anon_ar) do
8
10
  AnonymousActiveRecord.generate(
9
- columns: %w[name provider],
11
+ parent_klass: 'OmniAuth::Identity::Models::ActiveRecord',
12
+ columns: OmniAuth::Identity::Model::SCHEMA_ATTRIBUTES | %w[provider password_digest],
10
13
  connection_params: { adapter: 'sqlite3', encoding: 'utf8', database: ':memory:' }
11
14
  ) do
12
15
  def balloon
@@ -201,16 +204,10 @@ RSpec.describe OmniAuth::Strategies::Identity do
201
204
  }
202
205
  end
203
206
 
204
- before do
205
- allow(anon_ar).to receive('auth_key').and_return('email')
206
- m = double(uid: 'abc', name: 'Awesome Dude', email: 'awesome@example.com',
207
- info: { name: 'DUUUUDE!' }, persisted?: true)
208
- expect(anon_ar).to receive(:create).with(properties).and_return(m)
209
- end
210
-
211
207
  it 'sets the auth hash' do
212
208
  post '/auth/identity/register', properties
213
- expect(auth_hash['uid']).to eq('abc')
209
+ expect(auth_hash['uid']).to match(/\d+/)
210
+ expect(auth_hash['provider']).to eq('identity')
214
211
  end
215
212
  end
216
213
 
@@ -224,16 +221,17 @@ RSpec.describe OmniAuth::Strategies::Identity do
224
221
  provider: 'identity'
225
222
  }
226
223
  end
227
- let(:invalid_identity) { double(persisted?: false) }
224
+ let(:invalid_identity) { double(persisted?: false, save: false) }
228
225
 
229
226
  before do
230
- expect(anon_ar).to receive(:create).with(properties).and_return(invalid_identity)
227
+ expect(anon_ar).to receive(:new).with(properties).and_return(invalid_identity)
231
228
  end
232
229
 
233
230
  context 'default' do
234
231
  it 'shows registration form' do
235
232
  post '/auth/identity/register', properties
236
233
  expect(last_response.body).to be_include('Register Identity')
234
+ expect(last_response.body).to be_include('One or more fields were invalid')
237
235
  end
238
236
  end
239
237
 
@@ -248,6 +246,7 @@ RSpec.describe OmniAuth::Strategies::Identity do
248
246
  post '/auth/identity/register', properties
249
247
  expect(identity_hash).to eq(invalid_identity)
250
248
  expect(last_response.body).to be_include("FAIL'DOH!")
249
+ expect(last_response.body).not_to be_include('One or more fields were invalid')
251
250
  end
252
251
  end
253
252
  end
data/spec/spec_helper.rb CHANGED
@@ -6,6 +6,7 @@ require 'simplecov' if ruby_version >= Gem::Version.new('2.7') && RUBY_ENGINE ==
6
6
  require 'rack/test'
7
7
  require 'mongoid-rspec'
8
8
  require 'sqlite3'
9
+ require 'sequel'
9
10
  require 'anonymous_active_record'
10
11
  require 'byebug' if RUBY_ENGINE == 'ruby'
11
12
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniauth-identity
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Boling
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2021-02-13 00:00:00.000000000 Z
13
+ date: 2021-03-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bcrypt
@@ -41,61 +41,53 @@ dependencies:
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0'
43
43
  - !ruby/object:Gem::Dependency
44
- name: activerecord
44
+ name: anonymous_active_record
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: '5'
50
- type: :development
51
- prerelease: false
52
- version_requirements: !ruby/object:Gem::Requirement
53
- requirements:
54
- - - "~>"
55
- - !ruby/object:Gem::Version
56
- version: '5'
57
- - !ruby/object:Gem::Dependency
58
- name: anonymous_active_record
59
- requirement: !ruby/object:Gem::Requirement
60
- requirements:
49
+ version: '1.0'
61
50
  - - ">="
62
51
  - !ruby/object:Gem::Version
63
- version: 1.0.5
52
+ version: 1.0.8
64
53
  type: :development
65
54
  prerelease: false
66
55
  version_requirements: !ruby/object:Gem::Requirement
67
56
  requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.0'
68
60
  - - ">="
69
61
  - !ruby/object:Gem::Version
70
- version: 1.0.5
62
+ version: 1.0.8
71
63
  - !ruby/object:Gem::Dependency
72
- name: byebug
64
+ name: mongoid
73
65
  requirement: !ruby/object:Gem::Requirement
74
66
  requirements:
75
67
  - - "~>"
76
68
  - !ruby/object:Gem::Version
77
- version: '11'
69
+ version: '7'
78
70
  type: :development
79
71
  prerelease: false
80
72
  version_requirements: !ruby/object:Gem::Requirement
81
73
  requirements:
82
74
  - - "~>"
83
75
  - !ruby/object:Gem::Version
84
- version: '11'
76
+ version: '7'
85
77
  - !ruby/object:Gem::Dependency
86
- name: mongoid
78
+ name: nobrainer
87
79
  requirement: !ruby/object:Gem::Requirement
88
80
  requirements:
89
81
  - - "~>"
90
82
  - !ruby/object:Gem::Version
91
- version: '6'
83
+ version: '0'
92
84
  type: :development
93
85
  prerelease: false
94
86
  version_requirements: !ruby/object:Gem::Requirement
95
87
  requirements:
96
88
  - - "~>"
97
89
  - !ruby/object:Gem::Version
98
- version: '6'
90
+ version: '0'
99
91
  - !ruby/object:Gem::Dependency
100
92
  name: rack-test
101
93
  requirement: !ruby/object:Gem::Requirement
@@ -139,132 +131,34 @@ dependencies:
139
131
  - !ruby/object:Gem::Version
140
132
  version: '3'
141
133
  - !ruby/object:Gem::Dependency
142
- name: rubocop
134
+ name: sequel
143
135
  requirement: !ruby/object:Gem::Requirement
144
136
  requirements:
145
137
  - - "~>"
146
138
  - !ruby/object:Gem::Version
147
- version: '1.9'
139
+ version: '5'
148
140
  type: :development
149
141
  prerelease: false
150
142
  version_requirements: !ruby/object:Gem::Requirement
151
143
  requirements:
152
144
  - - "~>"
153
145
  - !ruby/object:Gem::Version
154
- version: '1.9'
155
- - !ruby/object:Gem::Dependency
156
- name: rubocop-md
157
- requirement: !ruby/object:Gem::Requirement
158
- requirements:
159
- - - ">="
160
- - !ruby/object:Gem::Version
161
- version: '0'
162
- type: :development
163
- prerelease: false
164
- version_requirements: !ruby/object:Gem::Requirement
165
- requirements:
166
- - - ">="
167
- - !ruby/object:Gem::Version
168
- version: '0'
169
- - !ruby/object:Gem::Dependency
170
- name: rubocop-minitest
171
- requirement: !ruby/object:Gem::Requirement
172
- requirements:
173
- - - ">="
174
- - !ruby/object:Gem::Version
175
- version: '0'
176
- type: :development
177
- prerelease: false
178
- version_requirements: !ruby/object:Gem::Requirement
179
- requirements:
180
- - - ">="
181
- - !ruby/object:Gem::Version
182
- version: '0'
183
- - !ruby/object:Gem::Dependency
184
- name: rubocop-packaging
185
- requirement: !ruby/object:Gem::Requirement
186
- requirements:
187
- - - ">="
188
- - !ruby/object:Gem::Version
189
- version: '0'
190
- type: :development
191
- prerelease: false
192
- version_requirements: !ruby/object:Gem::Requirement
193
- requirements:
194
- - - ">="
195
- - !ruby/object:Gem::Version
196
- version: '0'
197
- - !ruby/object:Gem::Dependency
198
- name: rubocop-performance
199
- requirement: !ruby/object:Gem::Requirement
200
- requirements:
201
- - - ">="
202
- - !ruby/object:Gem::Version
203
- version: '0'
204
- type: :development
205
- prerelease: false
206
- version_requirements: !ruby/object:Gem::Requirement
207
- requirements:
208
- - - ">="
209
- - !ruby/object:Gem::Version
210
- version: '0'
211
- - !ruby/object:Gem::Dependency
212
- name: rubocop-rake
213
- requirement: !ruby/object:Gem::Requirement
214
- requirements:
215
- - - ">="
216
- - !ruby/object:Gem::Version
217
- version: '0'
218
- type: :development
219
- prerelease: false
220
- version_requirements: !ruby/object:Gem::Requirement
221
- requirements:
222
- - - ">="
223
- - !ruby/object:Gem::Version
224
- version: '0'
225
- - !ruby/object:Gem::Dependency
226
- name: rubocop-rspec
227
- requirement: !ruby/object:Gem::Requirement
228
- requirements:
229
- - - ">="
230
- - !ruby/object:Gem::Version
231
- version: '0'
232
- type: :development
233
- prerelease: false
234
- version_requirements: !ruby/object:Gem::Requirement
235
- requirements:
236
- - - ">="
237
- - !ruby/object:Gem::Version
238
- version: '0'
146
+ version: '5'
239
147
  - !ruby/object:Gem::Dependency
240
- name: simplecov
148
+ name: sqlite3
241
149
  requirement: !ruby/object:Gem::Requirement
242
150
  requirements:
243
151
  - - "~>"
244
152
  - !ruby/object:Gem::Version
245
- version: '0.21'
153
+ version: '1.4'
246
154
  type: :development
247
155
  prerelease: false
248
156
  version_requirements: !ruby/object:Gem::Requirement
249
157
  requirements:
250
158
  - - "~>"
251
159
  - !ruby/object:Gem::Version
252
- version: '0.21'
253
- - !ruby/object:Gem::Dependency
254
- name: sqlite3
255
- requirement: !ruby/object:Gem::Requirement
256
- requirements:
257
- - - ">="
258
- - !ruby/object:Gem::Version
259
- version: '0'
260
- type: :development
261
- prerelease: false
262
- version_requirements: !ruby/object:Gem::Requirement
263
- requirements:
264
- - - ">="
265
- - !ruby/object:Gem::Version
266
- version: '0'
267
- description: Internal authentication handlers for OmniAuth.
160
+ version: '1.4'
161
+ description: Traditional username/password based authentication system for OmniAuth
268
162
  email:
269
163
  executables: []
270
164
  extensions: []
@@ -281,12 +175,16 @@ files:
281
175
  - lib/omniauth/identity/models/active_record.rb
282
176
  - lib/omniauth/identity/models/couch_potato.rb
283
177
  - lib/omniauth/identity/models/mongoid.rb
178
+ - lib/omniauth/identity/models/no_brainer.rb
179
+ - lib/omniauth/identity/models/sequel.rb
284
180
  - lib/omniauth/identity/secure_password.rb
285
181
  - lib/omniauth/strategies/identity.rb
286
182
  - spec/omniauth/identity/model_spec.rb
287
183
  - spec/omniauth/identity/models/active_record_spec.rb
288
184
  - spec/omniauth/identity/models/couch_potato_spec.rb
289
185
  - spec/omniauth/identity/models/mongoid_spec.rb
186
+ - spec/omniauth/identity/models/no_brainer_spec.rb
187
+ - spec/omniauth/identity/models/sequel_spec.rb
290
188
  - spec/omniauth/identity/secure_password_spec.rb
291
189
  - spec/omniauth/strategies/identity_spec.rb
292
190
  - spec/spec_helper.rb
@@ -310,15 +208,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
310
208
  - !ruby/object:Gem::Version
311
209
  version: 1.3.6
312
210
  requirements: []
313
- rubygems_version: 3.2.9
211
+ rubygems_version: 3.2.3
314
212
  signing_key:
315
213
  specification_version: 4
316
- summary: Internal authentication handlers for OmniAuth.
214
+ summary: Traditional username/password based authentication system for OmniAuth
317
215
  test_files:
318
- - spec/spec_helper.rb
319
- - spec/omniauth/identity/models/mongoid_spec.rb
216
+ - spec/omniauth/identity/model_spec.rb
320
217
  - spec/omniauth/identity/models/active_record_spec.rb
321
218
  - spec/omniauth/identity/models/couch_potato_spec.rb
219
+ - spec/omniauth/identity/models/mongoid_spec.rb
220
+ - spec/omniauth/identity/models/no_brainer_spec.rb
221
+ - spec/omniauth/identity/models/sequel_spec.rb
322
222
  - spec/omniauth/identity/secure_password_spec.rb
323
- - spec/omniauth/identity/model_spec.rb
324
223
  - spec/omniauth/strategies/identity_spec.rb
224
+ - spec/spec_helper.rb