omniauth-identity 3.0.0 → 3.0.5

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.
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