devise_token_auth_multi_email 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +13 -0
- data/README.md +97 -0
- data/Rakefile +42 -0
- data/app/controllers/devise_token_auth/application_controller.rb +100 -0
- data/app/controllers/devise_token_auth/concerns/resource_finder.rb +68 -0
- data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +199 -0
- data/app/controllers/devise_token_auth/confirmations_controller.rb +89 -0
- data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +284 -0
- data/app/controllers/devise_token_auth/passwords_controller.rb +216 -0
- data/app/controllers/devise_token_auth/registrations_controller.rb +205 -0
- data/app/controllers/devise_token_auth/sessions_controller.rb +153 -0
- data/app/controllers/devise_token_auth/token_validations_controller.rb +31 -0
- data/app/controllers/devise_token_auth/unlocks_controller.rb +94 -0
- data/app/models/devise_token_auth/concerns/active_record_support.rb +18 -0
- data/app/models/devise_token_auth/concerns/confirmable_support.rb +28 -0
- data/app/models/devise_token_auth/concerns/mongoid_support.rb +19 -0
- data/app/models/devise_token_auth/concerns/tokens_serialization.rb +31 -0
- data/app/models/devise_token_auth/concerns/user.rb +282 -0
- data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +39 -0
- data/app/validators/devise_token_auth_email_validator.rb +31 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise_token_auth/omniauth_external_window.html.erb +38 -0
- data/config/locales/da-DK.yml +52 -0
- data/config/locales/de.yml +51 -0
- data/config/locales/en.yml +60 -0
- data/config/locales/es.yml +51 -0
- data/config/locales/fa.yml +60 -0
- data/config/locales/fr.yml +51 -0
- data/config/locales/he.yml +52 -0
- data/config/locales/it.yml +48 -0
- data/config/locales/ja.yml +60 -0
- data/config/locales/ko.yml +51 -0
- data/config/locales/nl.yml +32 -0
- data/config/locales/pl.yml +51 -0
- data/config/locales/pt-BR.yml +48 -0
- data/config/locales/pt.yml +51 -0
- data/config/locales/ro.yml +48 -0
- data/config/locales/ru.yml +52 -0
- data/config/locales/sq.yml +48 -0
- data/config/locales/sv.yml +52 -0
- data/config/locales/uk.yml +61 -0
- data/config/locales/vi.yml +52 -0
- data/config/locales/zh-CN.yml +48 -0
- data/config/locales/zh-HK.yml +50 -0
- data/config/locales/zh-TW.yml +50 -0
- data/lib/devise_token_auth/blacklist.rb +6 -0
- data/lib/devise_token_auth/controllers/helpers.rb +157 -0
- data/lib/devise_token_auth/controllers/url_helpers.rb +10 -0
- data/lib/devise_token_auth/engine.rb +105 -0
- data/lib/devise_token_auth/errors.rb +8 -0
- data/lib/devise_token_auth/rails/routes.rb +122 -0
- data/lib/devise_token_auth/token_factory.rb +126 -0
- data/lib/devise_token_auth/url.rb +44 -0
- data/lib/devise_token_auth/version.rb +5 -0
- data/lib/devise_token_auth.rb +14 -0
- data/lib/generators/devise_token_auth/USAGE +31 -0
- data/lib/generators/devise_token_auth/install_generator.rb +91 -0
- data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
- data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
- data/lib/generators/devise_token_auth/install_views_generator.rb +18 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +66 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +49 -0
- data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
- data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +56 -0
- data/lib/tasks/devise_token_auth_tasks.rake +6 -0
- data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
- data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
- data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
- data/test/controllers/custom/custom_registrations_controller_test.rb +63 -0
- data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
- data/test/controllers/custom/custom_token_validations_controller_test.rb +42 -0
- data/test/controllers/demo_group_controller_test.rb +151 -0
- data/test/controllers/demo_mang_controller_test.rb +313 -0
- data/test/controllers/demo_user_controller_test.rb +658 -0
- data/test/controllers/devise_token_auth/confirmations_controller_test.rb +275 -0
- data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +438 -0
- data/test/controllers/devise_token_auth/passwords_controller_test.rb +893 -0
- data/test/controllers/devise_token_auth/registrations_controller_test.rb +920 -0
- data/test/controllers/devise_token_auth/sessions_controller_test.rb +605 -0
- data/test/controllers/devise_token_auth/token_validations_controller_test.rb +142 -0
- data/test/controllers/devise_token_auth/unlocks_controller_test.rb +235 -0
- data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
- data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
- data/test/controllers/overrides/passwords_controller_test.rb +64 -0
- data/test/controllers/overrides/registrations_controller_test.rb +46 -0
- data/test/controllers/overrides/sessions_controller_test.rb +35 -0
- data/test/controllers/overrides/token_validations_controller_test.rb +43 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/app/active_record/confirmable_user.rb +11 -0
- data/test/dummy/app/active_record/lockable_user.rb +7 -0
- data/test/dummy/app/active_record/mang.rb +5 -0
- data/test/dummy/app/active_record/only_email_user.rb +7 -0
- data/test/dummy/app/active_record/scoped_user.rb +9 -0
- data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
- data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
- data/test/dummy/app/active_record/user.rb +6 -0
- data/test/dummy/app/controllers/application_controller.rb +14 -0
- data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
- data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
- data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
- data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
- data/test/dummy/app/controllers/custom/registrations_controller.rb +39 -0
- data/test/dummy/app/controllers/custom/sessions_controller.rb +29 -0
- data/test/dummy/app/controllers/custom/token_validations_controller.rb +19 -0
- data/test/dummy/app/controllers/demo_group_controller.rb +15 -0
- data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
- data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
- data/test/dummy/app/controllers/overrides/confirmations_controller.rb +29 -0
- data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
- data/test/dummy/app/controllers/overrides/passwords_controller.rb +36 -0
- data/test/dummy/app/controllers/overrides/registrations_controller.rb +29 -0
- data/test/dummy/app/controllers/overrides/sessions_controller.rb +36 -0
- data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
- data/test/dummy/app/helpers/application_helper.rb +1058 -0
- data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
- data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
- data/test/dummy/app/mongoid/lockable_user.rb +38 -0
- data/test/dummy/app/mongoid/mang.rb +46 -0
- data/test/dummy/app/mongoid/only_email_user.rb +33 -0
- data/test/dummy/app/mongoid/scoped_user.rb +50 -0
- data/test/dummy/app/mongoid/unconfirmable_user.rb +44 -0
- data/test/dummy/app/mongoid/unregisterable_user.rb +47 -0
- data/test/dummy/app/mongoid/user.rb +49 -0
- data/test/dummy/app/views/layouts/application.html.erb +12 -0
- data/test/dummy/config/application.rb +50 -0
- data/test/dummy/config/application.yml.bk +0 -0
- data/test/dummy/config/boot.rb +11 -0
- data/test/dummy/config/environment.rb +7 -0
- data/test/dummy/config/environments/development.rb +36 -0
- data/test/dummy/config/environments/production.rb +68 -0
- data/test/dummy/config/environments/test.rb +58 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/devise.rb +290 -0
- data/test/dummy/config/initializers/devise_token_auth.rb +55 -0
- data/test/dummy/config/initializers/figaro.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
- data/test/dummy/config/initializers/inflections.rb +18 -0
- data/test/dummy/config/initializers/mime_types.rb +6 -0
- data/test/dummy/config/initializers/omniauth.rb +11 -0
- data/test/dummy/config/initializers/session_store.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
- data/test/dummy/config/routes.rb +57 -0
- data/test/dummy/config/spring.rb +3 -0
- data/test/dummy/config.ru +18 -0
- data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +58 -0
- data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +57 -0
- data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +8 -0
- data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +7 -0
- data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +55 -0
- data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +56 -0
- data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +56 -0
- data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +56 -0
- data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +56 -0
- data/test/dummy/db/migrate/20190924101113_devise_token_auth_create_confirmable_users.rb +49 -0
- data/test/dummy/db/schema.rb +198 -0
- data/test/dummy/lib/migration_database_helper.rb +43 -0
- data/test/dummy/tmp/generators/app/models/mang.rb +9 -0
- data/test/dummy/tmp/generators/app/models/user.rb +9 -0
- data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +60 -0
- data/test/dummy/tmp/generators/config/routes.rb +9 -0
- data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_mangs.rb +49 -0
- data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_users.rb +49 -0
- data/test/factories/users.rb +41 -0
- data/test/lib/devise_token_auth/blacklist_test.rb +19 -0
- data/test/lib/devise_token_auth/rails/custom_routes_test.rb +29 -0
- data/test/lib/devise_token_auth/rails/routes_test.rb +87 -0
- data/test/lib/devise_token_auth/token_factory_test.rb +191 -0
- data/test/lib/devise_token_auth/url_test.rb +26 -0
- data/test/lib/generators/devise_token_auth/install_generator_test.rb +217 -0
- data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
- data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +25 -0
- data/test/models/concerns/mongoid_support_test.rb +31 -0
- data/test/models/concerns/tokens_serialization_test.rb +104 -0
- data/test/models/confirmable_user_test.rb +35 -0
- data/test/models/only_email_user_test.rb +29 -0
- data/test/models/user_test.rb +224 -0
- data/test/support/controllers/routes.rb +43 -0
- data/test/test_helper.rb +134 -0
- metadata +502 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DeviseTokenAuth::Url
|
|
4
|
+
|
|
5
|
+
def self.generate(url, params = {})
|
|
6
|
+
uri = URI(url)
|
|
7
|
+
|
|
8
|
+
res = "#{uri.scheme}://#{uri.host}"
|
|
9
|
+
res += ":#{uri.port}" if (uri.port && uri.port != 80 && uri.port != 443)
|
|
10
|
+
res += uri.path.to_s if uri.path
|
|
11
|
+
query = [uri.query, params.to_query].reject(&:blank?).join('&')
|
|
12
|
+
res += "?#{query}"
|
|
13
|
+
res += "##{uri.fragment}" if uri.fragment
|
|
14
|
+
# repeat any query params after the fragment to deal with Angular eating any pre fragment query params, used
|
|
15
|
+
# in the reset password redirect url
|
|
16
|
+
res += "?#{query}" if uri.fragment
|
|
17
|
+
|
|
18
|
+
res
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.whitelisted?(url)
|
|
22
|
+
url.nil? || \
|
|
23
|
+
!!DeviseTokenAuth.redirect_whitelist.find do |pattern|
|
|
24
|
+
!!Wildcat.new(pattern).match(url)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# wildcard convenience class
|
|
29
|
+
class Wildcat
|
|
30
|
+
def self.parse_to_regex(str)
|
|
31
|
+
escaped = Regexp.escape(str).gsub('\*','.*?')
|
|
32
|
+
Regexp.new("^#{escaped}$", Regexp::IGNORECASE)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def initialize(str)
|
|
36
|
+
@regex = self.class.parse_to_regex(str)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def match(str)
|
|
40
|
+
!!@regex.match(str)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'devise'
|
|
4
|
+
|
|
5
|
+
module DeviseTokenAuth
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
require 'devise_token_auth/engine'
|
|
9
|
+
require 'devise_token_auth/controllers/helpers'
|
|
10
|
+
require 'devise_token_auth/controllers/url_helpers'
|
|
11
|
+
require 'devise_token_auth/url'
|
|
12
|
+
require 'devise_token_auth/errors'
|
|
13
|
+
require 'devise_token_auth/blacklist'
|
|
14
|
+
require 'devise_token_auth/token_factory'
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
This generator will install all the necessary configuration and migration
|
|
3
|
+
files for the devise_token_auth gem. See
|
|
4
|
+
https://github.com/lynndylanhurley/devise_token_auth for more information.
|
|
5
|
+
|
|
6
|
+
Arguments:
|
|
7
|
+
USER_CLASS # The name of the class to use for user authentication. Default is
|
|
8
|
+
# 'User'
|
|
9
|
+
MOUNT_PATH # The path at which to mount the authentication routes. Default is
|
|
10
|
+
# 'auth'. More detail documentation is here:
|
|
11
|
+
# https://devise-token-auth.gitbook.io/devise-token-auth/usage
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
rails generate devise_token_auth:install User auth
|
|
15
|
+
|
|
16
|
+
This will create:
|
|
17
|
+
config/initializers/devise_token_auth.rb
|
|
18
|
+
db/migrate/<%= Time.zone.now.utc.strftime("%Y%m%d%H%M%S") %>_create_devise_token_auth_create_users.rb
|
|
19
|
+
app/models/user.rb
|
|
20
|
+
|
|
21
|
+
If 'app/models/user.rb' already exists, the following line will be inserted
|
|
22
|
+
after the class definition:
|
|
23
|
+
include DeviseTokenAuth::Concerns::User
|
|
24
|
+
|
|
25
|
+
The following line will be inserted into your application controller at
|
|
26
|
+
app/controllers/application_controller.rb:
|
|
27
|
+
include DeviseTokenAuth::Concerns::SetUserByToken
|
|
28
|
+
|
|
29
|
+
The following line will be inserted at the top of 'config/routes.rb' if it
|
|
30
|
+
does not already exist:
|
|
31
|
+
mount_devise_token_auth_for "User", at: 'auth'
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'install_generator_helpers'
|
|
4
|
+
|
|
5
|
+
module DeviseTokenAuth
|
|
6
|
+
class InstallGenerator < Rails::Generators::Base
|
|
7
|
+
include Rails::Generators::Migration
|
|
8
|
+
include DeviseTokenAuth::InstallGeneratorHelpers
|
|
9
|
+
|
|
10
|
+
class_option :primary_key_type, type: :string, desc: 'The type for primary key'
|
|
11
|
+
|
|
12
|
+
def copy_migrations
|
|
13
|
+
if self.class.migration_exists?('db/migrate', "devise_token_auth_create_#{user_class.pluralize.gsub('::','').underscore}")
|
|
14
|
+
say_status('skipped', "Migration 'devise_token_auth_create_#{user_class.pluralize.gsub('::','').underscore}' already exists")
|
|
15
|
+
else
|
|
16
|
+
migration_template(
|
|
17
|
+
'devise_token_auth_create_users.rb.erb',
|
|
18
|
+
"db/migrate/devise_token_auth_create_#{user_class.pluralize.gsub('::','').underscore}.rb"
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def create_user_model
|
|
24
|
+
fname = "app/models/#{user_class.underscore}.rb"
|
|
25
|
+
if File.exist?(File.join(destination_root, fname))
|
|
26
|
+
inclusion = 'include DeviseTokenAuth::Concerns::User'
|
|
27
|
+
unless parse_file_for_line(fname, inclusion)
|
|
28
|
+
|
|
29
|
+
active_record_needle = (Rails::VERSION::MAJOR >= 5) ? 'ApplicationRecord' : 'ActiveRecord::Base'
|
|
30
|
+
inject_into_file fname, after: "class #{user_class} < #{active_record_needle}\n" do <<-'RUBY'
|
|
31
|
+
# Include default devise modules.
|
|
32
|
+
devise :database_authenticatable, :registerable,
|
|
33
|
+
:recoverable, :rememberable, :trackable, :validatable,
|
|
34
|
+
:confirmable, :omniauthable
|
|
35
|
+
include DeviseTokenAuth::Concerns::User
|
|
36
|
+
RUBY
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
else
|
|
40
|
+
template('user.rb.erb', fname)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
def self.next_migration_number(path)
|
|
47
|
+
Time.zone.now.utc.strftime('%Y%m%d%H%M%S')
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def json_supported_database?
|
|
51
|
+
(postgres? && postgres_correct_version?) || (mysql? && mysql_correct_version?)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def postgres?
|
|
55
|
+
database_name == 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter'
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def postgres_correct_version?
|
|
59
|
+
database_version > '9.3'
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def mysql?
|
|
63
|
+
database_name == 'ActiveRecord::ConnectionAdapters::MysqlAdapter'
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def mysql_correct_version?
|
|
67
|
+
database_version > '5.7.7'
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def database_name
|
|
71
|
+
ActiveRecord::Base.connection.class.name
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def database_version
|
|
75
|
+
ActiveRecord::Base.connection.select_value('SELECT VERSION()')
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def rails_5_or_newer?
|
|
79
|
+
Rails::VERSION::MAJOR >= 5
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def primary_key_type
|
|
83
|
+
primary_key_string if rails_5_or_newer?
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def primary_key_string
|
|
87
|
+
key_string = options[:primary_key_type]
|
|
88
|
+
", id: :#{key_string}" if key_string
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
module DeviseTokenAuth
|
|
2
|
+
module InstallGeneratorHelpers
|
|
3
|
+
class << self
|
|
4
|
+
def included(mod)
|
|
5
|
+
mod.class_eval do
|
|
6
|
+
source_root File.expand_path('templates', __dir__)
|
|
7
|
+
|
|
8
|
+
argument :user_class, type: :string, default: 'User'
|
|
9
|
+
argument :mount_path, type: :string, default: 'auth'
|
|
10
|
+
|
|
11
|
+
def create_initializer_file
|
|
12
|
+
copy_file('devise_token_auth.rb', 'config/initializers/devise_token_auth.rb')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def include_controller_concerns
|
|
16
|
+
fname = 'app/controllers/application_controller.rb'
|
|
17
|
+
line = 'include DeviseTokenAuth::Concerns::SetUserByToken'
|
|
18
|
+
|
|
19
|
+
if File.exist?(File.join(destination_root, fname))
|
|
20
|
+
if parse_file_for_line(fname, line)
|
|
21
|
+
say_status('skipped', 'Concern is already included in the application controller.')
|
|
22
|
+
elsif is_rails_api?
|
|
23
|
+
inject_into_file fname, after: "class ApplicationController < ActionController::API\n" do <<-'RUBY'
|
|
24
|
+
include DeviseTokenAuth::Concerns::SetUserByToken
|
|
25
|
+
RUBY
|
|
26
|
+
end
|
|
27
|
+
else
|
|
28
|
+
inject_into_file fname, after: "class ApplicationController < ActionController::Base\n" do <<-'RUBY'
|
|
29
|
+
include DeviseTokenAuth::Concerns::SetUserByToken
|
|
30
|
+
RUBY
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
else
|
|
34
|
+
say_status('skipped', "app/controllers/application_controller.rb not found. Add 'include DeviseTokenAuth::Concerns::SetUserByToken' to any controllers that require authentication.")
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def add_route_mount
|
|
39
|
+
f = 'config/routes.rb'
|
|
40
|
+
str = "mount_devise_token_auth_for '#{user_class}', at: '#{mount_path}'"
|
|
41
|
+
|
|
42
|
+
if File.exist?(File.join(destination_root, f))
|
|
43
|
+
line = parse_file_for_line(f, 'mount_devise_token_auth_for')
|
|
44
|
+
|
|
45
|
+
if line
|
|
46
|
+
existing_user_class = true
|
|
47
|
+
else
|
|
48
|
+
line = 'Rails.application.routes.draw do'
|
|
49
|
+
existing_user_class = false
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
if parse_file_for_line(f, str)
|
|
53
|
+
say_status('skipped', "Routes already exist for #{user_class} at #{mount_path}")
|
|
54
|
+
else
|
|
55
|
+
insert_after_line(f, line, str)
|
|
56
|
+
|
|
57
|
+
if existing_user_class
|
|
58
|
+
scoped_routes = ''\
|
|
59
|
+
"as :#{user_class.underscore} do\n"\
|
|
60
|
+
" # Define routes for #{user_class} within this block.\n"\
|
|
61
|
+
" end\n"
|
|
62
|
+
insert_after_line(f, str, scoped_routes)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
else
|
|
66
|
+
say_status('skipped', "config/routes.rb not found. Add \"mount_devise_token_auth_for '#{user_class}', at: '#{mount_path}'\" to your routes file.")
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
def insert_after_line(filename, line, str)
|
|
73
|
+
gsub_file filename, /(#{Regexp.escape(line)})/mi do |match|
|
|
74
|
+
"#{match}\n #{str}"
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def parse_file_for_line(filename, str)
|
|
79
|
+
match = false
|
|
80
|
+
|
|
81
|
+
File.open(File.join(destination_root, filename)) do |f|
|
|
82
|
+
f.each_line do |line|
|
|
83
|
+
match = line if line =~ /(#{Regexp.escape(str)})/mi
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
match
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def is_rails_api?
|
|
90
|
+
fname = 'app/controllers/application_controller.rb'
|
|
91
|
+
line = 'class ApplicationController < ActionController::API'
|
|
92
|
+
parse_file_for_line(fname, line)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'install_generator_helpers'
|
|
4
|
+
|
|
5
|
+
module DeviseTokenAuth
|
|
6
|
+
class InstallMongoidGenerator < Rails::Generators::Base
|
|
7
|
+
include DeviseTokenAuth::InstallGeneratorHelpers
|
|
8
|
+
|
|
9
|
+
def create_user_model
|
|
10
|
+
fname = "app/models/#{user_class.underscore}.rb"
|
|
11
|
+
if File.exist?(File.join(destination_root, fname))
|
|
12
|
+
inclusion = 'include DeviseTokenAuth::Concerns::User'
|
|
13
|
+
unless parse_file_for_line(fname, inclusion)
|
|
14
|
+
inject_into_file fname, before: /end\s\z/ do <<-'RUBY'
|
|
15
|
+
|
|
16
|
+
include Mongoid::Locker
|
|
17
|
+
|
|
18
|
+
field :locker_locked_at, type: Time
|
|
19
|
+
field :locker_locked_until, type: Time
|
|
20
|
+
|
|
21
|
+
locker locked_at_field: :locker_locked_at,
|
|
22
|
+
locked_until_field: :locker_locked_until
|
|
23
|
+
|
|
24
|
+
## Required
|
|
25
|
+
field :provider, type: String
|
|
26
|
+
field :uid, type: String, default: ''
|
|
27
|
+
|
|
28
|
+
## Tokens
|
|
29
|
+
field :tokens, type: Hash, default: {}
|
|
30
|
+
|
|
31
|
+
# Include default devise modules. Others available are:
|
|
32
|
+
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
|
|
33
|
+
devise :database_authenticatable, :registerable,
|
|
34
|
+
:recoverable, :rememberable, :validatable
|
|
35
|
+
include DeviseTokenAuth::Concerns::User
|
|
36
|
+
|
|
37
|
+
index({ uid: 1, provider: 1}, { name: 'uid_provider_index', unique: true, background: true })
|
|
38
|
+
RUBY
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
else
|
|
42
|
+
template('user_mongoid.rb.erb', fname)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DeviseTokenAuth
|
|
4
|
+
class InstallViewsGenerator < Rails::Generators::Base
|
|
5
|
+
source_root File.expand_path('../../../app/views/devise/mailer', __dir__)
|
|
6
|
+
|
|
7
|
+
def copy_mailer_templates
|
|
8
|
+
copy_file(
|
|
9
|
+
'confirmation_instructions.html.erb',
|
|
10
|
+
'app/views/devise/mailer/confirmation_instructions.html.erb'
|
|
11
|
+
)
|
|
12
|
+
copy_file(
|
|
13
|
+
'reset_password_instructions.html.erb',
|
|
14
|
+
'app/views/devise/mailer/reset_password_instructions.html.erb'
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
DeviseTokenAuth.setup do |config|
|
|
4
|
+
# By default the authorization headers will change after each request. The
|
|
5
|
+
# client is responsible for keeping track of the changing tokens. Change
|
|
6
|
+
# this to false to prevent the Authorization header from changing after
|
|
7
|
+
# each request.
|
|
8
|
+
# config.change_headers_on_each_request = true
|
|
9
|
+
|
|
10
|
+
# By default, users will need to re-authenticate after 2 weeks. This setting
|
|
11
|
+
# determines how long tokens will remain valid after they are issued.
|
|
12
|
+
# config.token_lifespan = 2.weeks
|
|
13
|
+
|
|
14
|
+
# Limiting the token_cost to just 4 in testing will increase the performance of
|
|
15
|
+
# your test suite dramatically. The possible cost value is within range from 4
|
|
16
|
+
# to 31. It is recommended to not use a value more than 10 in other environments.
|
|
17
|
+
config.token_cost = Rails.env.test? ? 4 : 10
|
|
18
|
+
|
|
19
|
+
# Sets the max number of concurrent devices per user, which is 10 by default.
|
|
20
|
+
# After this limit is reached, the oldest tokens will be removed.
|
|
21
|
+
# config.max_number_of_devices = 10
|
|
22
|
+
|
|
23
|
+
# Sometimes it's necessary to make several requests to the API at the same
|
|
24
|
+
# time. In this case, each request in the batch will need to share the same
|
|
25
|
+
# auth token. This setting determines how far apart the requests can be while
|
|
26
|
+
# still using the same auth token.
|
|
27
|
+
# config.batch_request_buffer_throttle = 5.seconds
|
|
28
|
+
|
|
29
|
+
# This route will be the prefix for all oauth2 redirect callbacks. For
|
|
30
|
+
# example, using the default '/omniauth', the github oauth2 provider will
|
|
31
|
+
# redirect successful authentications to '/omniauth/github/callback'
|
|
32
|
+
# config.omniauth_prefix = "/omniauth"
|
|
33
|
+
|
|
34
|
+
# By default sending current password is not needed for the password update.
|
|
35
|
+
# Uncomment to enforce current_password param to be checked before all
|
|
36
|
+
# attribute updates. Set it to :password if you want it to be checked only if
|
|
37
|
+
# password is updated.
|
|
38
|
+
# config.check_current_password_before_update = :attributes
|
|
39
|
+
|
|
40
|
+
# By default we will use callbacks for single omniauth.
|
|
41
|
+
# It depends on fields like email, provider and uid.
|
|
42
|
+
# config.default_callbacks = true
|
|
43
|
+
|
|
44
|
+
# Makes it possible to change the headers names
|
|
45
|
+
# config.headers_names = {
|
|
46
|
+
# :'authorization' => 'Authorization',
|
|
47
|
+
# :'access-token' => 'access-token',
|
|
48
|
+
# :'client' => 'client',
|
|
49
|
+
# :'expiry' => 'expiry',
|
|
50
|
+
# :'uid' => 'uid',
|
|
51
|
+
# :'token-type' => 'token-type'
|
|
52
|
+
# }
|
|
53
|
+
|
|
54
|
+
# Makes it possible to use custom uid column
|
|
55
|
+
# config.other_uid = "foo"
|
|
56
|
+
|
|
57
|
+
# By default, only Bearer Token authentication is implemented out of the box.
|
|
58
|
+
# If, however, you wish to integrate with legacy Devise authentication, you can
|
|
59
|
+
# do so by enabling this flag. NOTE: This feature is highly experimental!
|
|
60
|
+
# config.enable_standard_devise_support = false
|
|
61
|
+
|
|
62
|
+
# By default DeviseTokenAuth will not send confirmation email, even when including
|
|
63
|
+
# devise confirmable module. If you want to use devise confirmable module and
|
|
64
|
+
# send email, set it to true. (This is a setting for compatibility)
|
|
65
|
+
# config.send_confirmation_email = true
|
|
66
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
class DeviseTokenAuthCreate<%= user_class.pluralize.gsub("::","") %> < ActiveRecord::Migration<%= "[#{Rails::VERSION::STRING[0..2]}]" if Rails::VERSION::MAJOR > 4 %>
|
|
2
|
+
def change
|
|
3
|
+
<% table_name = @user_class.pluralize.gsub("::","").underscore %>
|
|
4
|
+
create_table(:<%= table_name %><%= primary_key_type %>) do |t|
|
|
5
|
+
## Required
|
|
6
|
+
t.string :provider, :null => false, :default => "email"
|
|
7
|
+
t.string :uid, :null => false, :default => ""
|
|
8
|
+
|
|
9
|
+
## Database authenticatable
|
|
10
|
+
t.string :encrypted_password, :null => false, :default => ""
|
|
11
|
+
|
|
12
|
+
## Recoverable
|
|
13
|
+
t.string :reset_password_token
|
|
14
|
+
t.datetime :reset_password_sent_at
|
|
15
|
+
t.boolean :allow_password_change, :default => false
|
|
16
|
+
|
|
17
|
+
## Rememberable
|
|
18
|
+
t.datetime :remember_created_at
|
|
19
|
+
|
|
20
|
+
## Confirmable
|
|
21
|
+
t.string :confirmation_token
|
|
22
|
+
t.datetime :confirmed_at
|
|
23
|
+
t.datetime :confirmation_sent_at
|
|
24
|
+
t.string :unconfirmed_email # Only if using reconfirmable
|
|
25
|
+
|
|
26
|
+
## Lockable
|
|
27
|
+
# t.integer :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts
|
|
28
|
+
# t.string :unlock_token # Only if unlock strategy is :email or :both
|
|
29
|
+
# t.datetime :locked_at
|
|
30
|
+
|
|
31
|
+
## User Info
|
|
32
|
+
t.string :name
|
|
33
|
+
t.string :nickname
|
|
34
|
+
t.string :image
|
|
35
|
+
t.string :email
|
|
36
|
+
|
|
37
|
+
## Tokens
|
|
38
|
+
<%= json_supported_database? ? 't.json :tokens' : 't.text :tokens' %>
|
|
39
|
+
|
|
40
|
+
t.timestamps
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
add_index :<%= table_name %>, :email, unique: true
|
|
44
|
+
add_index :<%= table_name %>, [:uid, :provider], unique: true
|
|
45
|
+
add_index :<%= table_name %>, :reset_password_token, unique: true
|
|
46
|
+
add_index :<%= table_name %>, :confirmation_token, unique: true
|
|
47
|
+
# add_index :<%= table_name %>, :unlock_token, unique: true
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class <%= user_class %> < ActiveRecord::Base
|
|
4
|
+
# Include default devise modules. Others available are:
|
|
5
|
+
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
|
|
6
|
+
devise :database_authenticatable, :registerable,
|
|
7
|
+
:recoverable, :rememberable, :validatable
|
|
8
|
+
include DeviseTokenAuth::Concerns::User
|
|
9
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class <%= user_class %>
|
|
4
|
+
include Mongoid::Document
|
|
5
|
+
include Mongoid::Timestamps
|
|
6
|
+
include Mongoid::Locker
|
|
7
|
+
|
|
8
|
+
field :locker_locked_at, type: Time
|
|
9
|
+
field :locker_locked_until, type: Time
|
|
10
|
+
|
|
11
|
+
locker locked_at_field: :locker_locked_at,
|
|
12
|
+
locked_until_field: :locker_locked_until
|
|
13
|
+
|
|
14
|
+
## Database authenticatable
|
|
15
|
+
field :email, type: String, default: ''
|
|
16
|
+
field :encrypted_password, type: String, default: ''
|
|
17
|
+
|
|
18
|
+
## Recoverable
|
|
19
|
+
field :reset_password_token, type: String
|
|
20
|
+
field :reset_password_sent_at, type: Time
|
|
21
|
+
field :reset_password_redirect_url, type: String
|
|
22
|
+
field :allow_password_change, type: Boolean, default: false
|
|
23
|
+
|
|
24
|
+
## Rememberable
|
|
25
|
+
field :remember_created_at, type: Time
|
|
26
|
+
|
|
27
|
+
## Confirmable
|
|
28
|
+
field :confirmation_token, type: String
|
|
29
|
+
field :confirmed_at, type: Time
|
|
30
|
+
field :confirmation_sent_at, type: Time
|
|
31
|
+
field :unconfirmed_email, type: String # Only if using reconfirmable
|
|
32
|
+
|
|
33
|
+
## Lockable
|
|
34
|
+
# field :failed_attempts, type: Integer, default: 0 # Only if lock strategy is :failed_attempts
|
|
35
|
+
# field :unlock_token, type: String # Only if unlock strategy is :email or :both
|
|
36
|
+
# field :locked_at, type: Time
|
|
37
|
+
|
|
38
|
+
## Required
|
|
39
|
+
field :provider, type: String
|
|
40
|
+
field :uid, type: String, default: ''
|
|
41
|
+
|
|
42
|
+
## Tokens
|
|
43
|
+
field :tokens, type: Hash, default: {}
|
|
44
|
+
|
|
45
|
+
# Include default devise modules. Others available are:
|
|
46
|
+
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
|
|
47
|
+
devise :database_authenticatable, :registerable,
|
|
48
|
+
:recoverable, :rememberable, :validatable
|
|
49
|
+
include DeviseTokenAuth::Concerns::User
|
|
50
|
+
|
|
51
|
+
index({ email: 1 }, { name: 'email_index', unique: true, background: true })
|
|
52
|
+
index({ reset_password_token: 1 }, { name: 'reset_password_token_index', unique: true, sparse: true, background: true })
|
|
53
|
+
index({ confirmation_token: 1 }, { name: 'confirmation_token_index', unique: true, sparse: true, background: true })
|
|
54
|
+
index({ uid: 1, provider: 1}, { name: 'uid_provider_index', unique: true, background: true })
|
|
55
|
+
# index({ unlock_token: 1 }, { name: 'unlock_token_index', unique: true, sparse: true, background: true })
|
|
56
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
class Custom::ConfirmationsControllerTest < ActionController::TestCase
|
|
6
|
+
describe Custom::ConfirmationsController do
|
|
7
|
+
include CustomControllersRoutes
|
|
8
|
+
|
|
9
|
+
before do
|
|
10
|
+
@redirect_url = Faker::Internet.url
|
|
11
|
+
@new_user = create(:user)
|
|
12
|
+
@new_user.send_confirmation_instructions(redirect_url: @redirect_url)
|
|
13
|
+
@mail = ActionMailer::Base.deliveries.last
|
|
14
|
+
@token = @mail.body.match(/confirmation_token=([^&]*)[&"]/)[1]
|
|
15
|
+
@client_config = @mail.body.match(/config=([^&]*)&/)[1]
|
|
16
|
+
|
|
17
|
+
get :show,
|
|
18
|
+
params: { confirmation_token: @token, redirect_url: @redirect_url }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
test 'yield resource to block on show success' do
|
|
22
|
+
assert @controller.show_block_called?, 'show failed to yield resource to provided block'
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
class Custom::OmniauthCallbacksControllerTest < ActionDispatch::IntegrationTest
|
|
6
|
+
describe Custom::OmniauthCallbacksController do
|
|
7
|
+
include CustomControllersRoutes
|
|
8
|
+
|
|
9
|
+
setup do
|
|
10
|
+
OmniAuth.config.test_mode = true
|
|
11
|
+
OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new(
|
|
12
|
+
provider: 'facebook',
|
|
13
|
+
uid: '123545',
|
|
14
|
+
info: {
|
|
15
|
+
name: 'swong',
|
|
16
|
+
email: 'swongsong@yandex.ru'
|
|
17
|
+
}
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
test 'yield resource to block on omniauth_success success' do
|
|
22
|
+
@redirect_url = 'http://ng-token-auth.dev/'
|
|
23
|
+
post '/nice_user_auth/facebook',
|
|
24
|
+
params: { auth_origin_url: @redirect_url,
|
|
25
|
+
omniauth_window_type: 'newWindow' }
|
|
26
|
+
|
|
27
|
+
follow_all_redirects!
|
|
28
|
+
|
|
29
|
+
assert @controller.omniauth_success_block_called?,
|
|
30
|
+
'omniauth_success failed to yield resource to provided block'
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|