add_auth 0.2.2 → 0.4.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.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/README.md +64 -17
  4. data/ROADMAP.md +98 -43
  5. data/SECURITY.md +8 -0
  6. data/app/controllers/add_auth/accounts_controller.rb +146 -0
  7. data/app/controllers/add_auth/assets_controller.rb +2 -1
  8. data/app/controllers/add_auth/external_identities_controller.rb +56 -0
  9. data/app/controllers/add_auth/mobile_sessions_controller.rb +120 -0
  10. data/app/controllers/add_auth/provider_sign_ins_controller.rb +248 -0
  11. data/app/controllers/add_auth/reauthentications_controller.rb +5 -0
  12. data/app/helpers/add_auth/sign_ins_helper.rb +2 -1
  13. data/app/jobs/add_auth/account_delivery_job.rb +14 -0
  14. data/app/jobs/add_auth/account_request_job.rb +17 -0
  15. data/app/mailers/add_auth/account_mailer.rb +12 -0
  16. data/app/views/add_auth/account_mailer/link.text.erb +7 -0
  17. data/app/views/add_auth/accounts/_check_email.html.erb +5 -0
  18. data/app/views/add_auth/accounts/_delete.html.erb +6 -0
  19. data/app/views/add_auth/accounts/_email.html.erb +12 -0
  20. data/app/views/add_auth/accounts/_invalid_proof.html.erb +5 -0
  21. data/app/views/add_auth/accounts/_password.html.erb +12 -0
  22. data/app/views/add_auth/accounts/_proof.html.erb +16 -0
  23. data/app/views/add_auth/accounts/_register.html.erb +17 -0
  24. data/app/views/add_auth/accounts/_request.html.erb +17 -0
  25. data/app/views/add_auth/accounts/_unavailable.html.erb +3 -0
  26. data/app/views/add_auth/external_identities/_index.html.erb +22 -0
  27. data/app/views/add_auth/external_identities/_unavailable.html.erb +3 -0
  28. data/app/views/add_auth/passkeys/_controls.html.erb +3 -1
  29. data/app/views/add_auth/provider_sign_ins/_enrollment.html.erb +12 -0
  30. data/app/views/add_auth/provider_sign_ins/_failure.html.erb +3 -0
  31. data/app/views/add_auth/provider_sign_ins/_prepare.html.erb +7 -0
  32. data/app/views/add_auth/reauthentications/_form.html.erb +9 -0
  33. data/app/views/add_auth/sessions/_list.html.erb +1 -1
  34. data/app/views/add_auth/sessions/index.html.erb +7 -0
  35. data/app/views/add_auth/sign_ins/_confirmation.html.erb +1 -0
  36. data/app/views/add_auth/sign_ins/_form.html.erb +17 -0
  37. data/app/views/add_auth/sign_ins/_remember.html.erb +6 -0
  38. data/app/views/layouts/add_auth/authentication.html.erb +4 -3
  39. data/exe/add_auth-preflight +26 -0
  40. data/lib/add_auth/configuration.rb +78 -4
  41. data/lib/add_auth/core/access_policy.rb +11 -1
  42. data/lib/add_auth/core/account_lifecycle.rb +295 -0
  43. data/lib/add_auth/core/account_policy.rb +68 -0
  44. data/lib/add_auth/core/external_identities/evidence.rb +98 -0
  45. data/lib/add_auth/core/external_identities.rb +278 -0
  46. data/lib/add_auth/core/intake.rb +6 -1
  47. data/lib/add_auth/core/maintenance.rb +5 -3
  48. data/lib/add_auth/core/migration/account_adoption.rb +79 -0
  49. data/lib/add_auth/core/migration/readiness.rb +41 -0
  50. data/lib/add_auth/core/mobile_authentication.rb +35 -0
  51. data/lib/add_auth/core/mobile_handoffs.rb +83 -0
  52. data/lib/add_auth/core/mobile_profile.rb +46 -0
  53. data/lib/add_auth/core/mobile_response.rb +12 -0
  54. data/lib/add_auth/core/native_authentication.rb +77 -0
  55. data/lib/add_auth/core/passwords/bcrypt_support.rb +28 -0
  56. data/lib/add_auth/core/passwords/credential.rb +49 -0
  57. data/lib/add_auth/core/passwords/legacy_bcrypt.rb +43 -0
  58. data/lib/add_auth/core/passwords/lifecycle.rb +60 -0
  59. data/lib/add_auth/core/remaining_factors.rb +24 -0
  60. data/lib/add_auth/core/sessions.rb +102 -17
  61. data/lib/add_auth/core/step_up.rb +13 -1
  62. data/lib/add_auth/migration/static_inventory.rb +116 -0
  63. data/lib/add_auth/rails/account_password_entry.rb +24 -0
  64. data/lib/add_auth/rails/authentication.rb +1 -1
  65. data/lib/add_auth/rails/authentication_pages.rb +6 -1
  66. data/lib/add_auth/rails/doctor.rb +80 -6
  67. data/lib/add_auth/rails/ejection.rb +1 -1
  68. data/lib/add_auth/rails/engine.rb +6 -1
  69. data/lib/add_auth/rails/migration/account_store.rb +41 -0
  70. data/lib/add_auth/rails/migration/effective_inventory.rb +162 -0
  71. data/lib/add_auth/rails/migration/key_type.rb +23 -0
  72. data/lib/add_auth/rails/migration/source_bridge.rb +53 -0
  73. data/lib/add_auth/rails/password_adoption.rb +37 -0
  74. data/lib/add_auth/rails/provider_enrollment.rb +61 -0
  75. data/lib/add_auth/rails/provider_libraries/apple_form_post_correlation.rb +127 -0
  76. data/lib/add_auth/rails/provider_libraries/apple_jwks.rb +68 -0
  77. data/lib/add_auth/rails/provider_libraries/apple_native.rb +55 -0
  78. data/lib/add_auth/rails/provider_libraries/callback_route.rb +16 -0
  79. data/lib/add_auth/rails/provider_libraries/omniauth.rb +136 -0
  80. data/lib/add_auth/rails/provider_libraries/omniauth_correlation.rb +107 -0
  81. data/lib/add_auth/rails/provider_libraries/openid_connect.rb +62 -0
  82. data/lib/add_auth/rails/provider_libraries/request_protection.rb +43 -0
  83. data/lib/add_auth/rails/runtime.rb +179 -8
  84. data/lib/add_auth/rails/stores/account_credentials.rb +44 -0
  85. data/lib/add_auth/rails/stores/account_lock.rb +16 -7
  86. data/lib/add_auth/rails/stores/account_tokens.rb +104 -0
  87. data/lib/add_auth/rails/stores/authority.rb +28 -0
  88. data/lib/add_auth/rails/stores/commit_dispatch.rb +32 -0
  89. data/lib/add_auth/rails/stores/external_identities.rb +91 -0
  90. data/lib/add_auth/rails/stores/maintenance.rb +1 -1
  91. data/lib/add_auth/rails/stores/mobile_handoffs.rb +53 -0
  92. data/lib/add_auth/rails/stores/security_events.rb +3 -6
  93. data/lib/add_auth/rails/user_lifecycle.rb +8 -10
  94. data/lib/add_auth/result.rb +1 -0
  95. data/lib/add_auth/version.rb +1 -1
  96. data/lib/add_auth.rb +4 -0
  97. data/lib/generators/add_auth/accounts/accounts_generator.rb +56 -0
  98. data/lib/generators/add_auth/accounts/templates/add_add_auth_accounts.rb.tt +49 -0
  99. data/lib/generators/add_auth/accounts/templates/add_add_auth_provisioning.rb.tt +9 -0
  100. data/lib/generators/add_auth/accounts/templates/add_auth_account_token.rb +6 -0
  101. data/lib/generators/add_auth/accounts/templates/add_auth_address_claim.rb +6 -0
  102. data/lib/generators/add_auth/devise_accounts/devise_accounts_generator.rb +23 -0
  103. data/lib/generators/add_auth/devise_accounts/templates/prepare_add_auth_devise_accounts.rb.tt +17 -0
  104. data/lib/generators/add_auth/email_link/email_link_generator.rb +4 -1
  105. data/lib/generators/add_auth/email_link/templates/add_auth_challenge.js +1 -0
  106. data/lib/generators/add_auth/email_tokens/templates/create_add_auth_sign_in_tokens.rb.tt +3 -1
  107. data/lib/generators/add_auth/external_identities/external_identities_generator.rb +52 -0
  108. data/lib/generators/add_auth/external_identities/templates/add_add_auth_external_enrollment.rb.tt +5 -0
  109. data/lib/generators/add_auth/external_identities/templates/add_add_auth_external_identity_validity.rb.tt +5 -0
  110. data/lib/generators/add_auth/external_identities/templates/add_auth_external_identity.rb +4 -0
  111. data/lib/generators/add_auth/external_identities/templates/add_auth_external_transaction.rb +6 -0
  112. data/lib/generators/add_auth/external_identities/templates/create_add_auth_external_identities.rb.tt +50 -0
  113. data/lib/generators/add_auth/external_identities/templates/providers.rb +51 -0
  114. data/lib/generators/add_auth/feature_configuration.rb +21 -0
  115. data/lib/generators/add_auth/install/templates/initializer.rb +154 -46
  116. data/lib/generators/add_auth/javascript/templates/passkey.js +8 -5
  117. data/lib/generators/add_auth/mobile_sessions/mobile_sessions_generator.rb +48 -0
  118. data/lib/generators/add_auth/mobile_sessions/templates/add_add_auth_mobile_sessions.rb.tt +9 -0
  119. data/lib/generators/add_auth/mobile_sessions/templates/add_auth_mobile_handoff.rb +5 -0
  120. data/lib/generators/add_auth/mobile_sessions/templates/create_add_auth_mobile_handoffs.rb.tt +27 -0
  121. data/lib/generators/add_auth/mobile_sessions/templates/mobile.rb +8 -0
  122. data/lib/generators/add_auth/notifications/notifications_generator.rb +3 -4
  123. data/lib/generators/add_auth/notifications/templates/create_add_auth_security_events.rb.tt +3 -1
  124. data/lib/generators/add_auth/passkeys/passkeys_generator.rb +3 -21
  125. data/lib/generators/add_auth/passkeys/templates/add_add_auth_passkeys.rb.tt +7 -3
  126. data/lib/generators/add_auth/session_upgrade/session_upgrade_generator.rb +3 -1
  127. data/lib/generators/add_auth/step_up/step_up_generator.rb +5 -5
  128. data/lib/generators/add_auth/step_up/templates/add_add_auth_reauthentication.rb.tt +3 -1
  129. data/lib/tasks/add_auth.rake +18 -1
  130. metadata +101 -2
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rails/generators"
4
+ require "generators/add_auth/feature_configuration"
4
5
  require "rails/generators/active_record"
5
6
 
6
7
  module AddAuth
7
8
  module Generators
8
9
  class PasskeysGenerator < ::Rails::Generators::Base
9
10
  include ::Rails::Generators::Migration
11
+ include FeatureConfiguration
10
12
 
11
13
  source_root File.expand_path("templates", __dir__)
12
14
  def self.next_migration_number(dirname) = ::ActiveRecord::Generators::Base.next_migration_number(dirname)
@@ -47,27 +49,7 @@ module AddAuth
47
49
  post "recover/link", to: "add_auth/recoveries#confirm"
48
50
  ROUTES
49
51
  end
50
- path = "config/initializers/add_auth.rb"
51
- unless File.read(File.join(destination_root, path)).include?("config.passkeys.enabled = true")
52
- append_to_file path, <<~CONFIG
53
-
54
- AddAuth.configure do |config|
55
- config.passkeys.enabled = true
56
- # REQUIRED: stable RP ID and exact deployment origins, never request Host.
57
- # config.passkeys.rp_id = "example.com"
58
- # config.passkeys.origins = ["https://app.example.com"]
59
- # config.passkeys.name = "Your app"
60
- # Shared anonymous ceremony budget per five minutes; positive integer.
61
- # config.passkeys.anonymous_limit = 1000
62
- # Schedule add_auth:deliver_pending every minute. Production doctor
63
- # requires a completed cleanup within the last two minutes.
64
- # REQUIRED for email replacement: a host-verified recovery address.
65
- # config.trusted_recovery_address = ->(user) { user.email_address if user.confirmed? }
66
- # REQUIRED before strict activation: your documented support route.
67
- # config.support_url = "/support"
68
- end
69
- CONFIG
70
- end
52
+ enable_feature(:passkeys)
71
53
  say "Review and migrate before enabling traffic. Configure RP/origins, trusted recovery and notifications; run add_auth:doctor."
72
54
  end
73
55
  end
@@ -1,5 +1,9 @@
1
+ require "add_auth/rails/migration/key_type"
2
+
1
3
  class AddAddAuthPasskeys < ActiveRecord::Migration[8.0]
2
4
  def change
5
+ user_key_type = AddAuth::Rails::Migration::KeyType.for(connection, :users)
6
+ session_key_type = AddAuth::Rails::Migration::KeyType.for(connection, :sessions, session: true)
3
7
  # Rails 8.0 cannot reflect SQLite's FALSE literal emitted by Rails 8.1.
4
8
  # Keep the additive schema readable by both supported Rails lines.
5
9
  false_default = (connection.adapter_name == "SQLite") ? -> { "0" } : false
@@ -11,7 +15,7 @@ class AddAddAuthPasskeys < ActiveRecord::Migration[8.0]
11
15
  add_column :sessions, :authentication_credential_id, :string
12
16
  add_column :sessions, :authentication_uv, :boolean, default: false_default, null: false
13
17
  create_table :add_auth_credentials do |t|
14
- t.references :user, null: false, foreign_key: {on_delete: :cascade}
18
+ t.references :user, type: user_key_type, null: false, foreign_key: {on_delete: :cascade}
15
19
  t.string :external_id, null: false
16
20
  t.text :public_key, null: false
17
21
  t.bigint :sign_count, default: 0, null: false
@@ -31,8 +35,8 @@ class AddAddAuthPasskeys < ActiveRecord::Migration[8.0]
31
35
  t.string :kind, null: false
32
36
  t.string :browser_digest, null: false
33
37
  t.string :configuration_digest, null: false
34
- t.references :user, foreign_key: {on_delete: :cascade}
35
- t.references :session, foreign_key: {on_delete: :cascade}
38
+ t.references :user, type: user_key_type, foreign_key: {on_delete: :cascade}
39
+ t.references :session, type: session_key_type, foreign_key: {on_delete: :cascade}
36
40
  t.string :session_digest
37
41
  t.string :authentication_purpose
38
42
  t.datetime :expires_at, null: false
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rails/generators"
4
+ require "generators/add_auth/feature_configuration"
4
5
  require "rails/generators/active_record"
5
6
 
6
7
  module AddAuth
7
8
  module Generators
8
9
  class SessionUpgradeGenerator < ::Rails::Generators::Base
9
10
  include ::Rails::Generators::Migration
11
+ include FeatureConfiguration
10
12
 
11
13
  source_root File.expand_path("templates", __dir__)
12
14
 
@@ -62,7 +64,7 @@ module AddAuth
62
64
  unless File.read(File.join(destination_root, path)).include?('require "add_auth/rails/authentication"')
63
65
  prepend_to_file path, %(require "add_auth/rails/authentication"\nrequire "add_auth/rails/user_lifecycle"\n)
64
66
  end
65
- gsub_file path, "# config.session.enabled = true", "config.session.enabled = true"
67
+ enable_feature(:session)
66
68
  routes = File.join(destination_root, "config/routes.rb")
67
69
  source = File.read(routes)
68
70
  unless source.include?("# AddAuth session management")
@@ -1,18 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rails/generators"
4
+ require "generators/add_auth/feature_configuration"
4
5
  require "rails/generators/active_record"
5
6
 
6
7
  module AddAuth
7
8
  module Generators
8
9
  class StepUpGenerator < ::Rails::Generators::Base
9
10
  include ::Rails::Generators::Migration
11
+ include FeatureConfiguration
10
12
 
11
13
  source_root File.expand_path("templates", __dir__)
14
+ class_option :email_link, type: :boolean, default: true, desc: "Enable email sign-in alongside reauthentication"
12
15
  def self.next_migration_number(dirname) = ::ActiveRecord::Generators::Base.next_migration_number(dirname)
13
16
 
14
17
  def dependencies
15
- invoke "add_auth:email_link"
18
+ invoke "add_auth:email_link", [], enable: options[:email_link]
16
19
  end
17
20
 
18
21
  def persistence
@@ -33,10 +36,7 @@ module AddAuth
33
36
  post "reauthenticate/link", to: "add_auth/reauthentications#confirm"
34
37
  ROUTES
35
38
  end
36
- initializer = "config/initializers/add_auth.rb"
37
- unless File.read(File.join(destination_root, initializer)).include?("config.step_up.enabled = true")
38
- append_to_file initializer, "\nAddAuth.configure do |config|\n config.step_up.enabled = true\n # Declare purpose methods and a fixed safe GET return_to before use.\nend\n"
39
- end
39
+ enable_feature(:step_up)
40
40
  say "Migrate and declare config.step_up.purposes. Use with_elevated_session around sensitive database mutations."
41
41
  end
42
42
  end
@@ -1,8 +1,10 @@
1
+ require "add_auth/rails/migration/key_type"
2
+
1
3
  class AddAddAuthReauthentication < ActiveRecord::Migration[8.0]
2
4
  def change
3
5
  add_column :sessions, :elevation_version, :string
4
6
  add_column :sessions, :elevation_expires_at, :datetime
5
- add_reference :add_auth_sign_in_tokens, :session, foreign_key: {on_delete: :cascade}
7
+ add_reference :add_auth_sign_in_tokens, :session, type: AddAuth::Rails::Migration::KeyType.for(connection, :sessions, session: true), foreign_key: {on_delete: :cascade}
6
8
  add_column :add_auth_sign_in_tokens, :session_digest, :string
7
9
  add_column :add_auth_sign_in_tokens, :authentication_purpose, :string
8
10
  end
@@ -1,6 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  namespace :add_auth do
4
+ desc "Read-only Devise inventory in an isolated local test/development host"
5
+ task devise_preflight: :environment do
6
+ require "json"
7
+ require "add_auth/rails/migration/effective_inventory"
8
+ begin
9
+ report = AddAuth::Rails::Migration::EffectiveInventory.new.call
10
+ puts JSON.pretty_generate(report)
11
+ abort "Inventory is incomplete; resolve the reported bounds before migration." unless report.dig(:facts, :complete)
12
+ rescue
13
+ # Host exception text may contain query values or secret configuration.
14
+ abort "Effective inventory failed. Use an isolated local Devise host with one SQLite/PostgreSQL pool and no surrounding transaction."
15
+ end
16
+ end
17
+
4
18
  desc "Check installed AddAuth authentication, delivery and maintenance wiring"
5
19
  task doctor: :environment do
6
20
  require "add_auth/rails/doctor"
@@ -19,13 +33,16 @@ namespace :add_auth do
19
33
  require "add_auth/rails/stores/maintenance"
20
34
  models = {}
21
35
  models[:session] = ::Session if AddAuth.configuration.session.enabled && defined?(::Session)
36
+ models[:external_transaction] = ::AddAuthExternalTransaction if defined?(::AddAuthExternalTransaction)
37
+ models[:mobile_handoff] = ::AddAuthMobileHandoff if defined?(::AddAuthMobileHandoff)
22
38
  models[:ceremony] = ::AddAuthCeremony if defined?(::AddAuthCeremony)
23
39
  models[:email] = ::AddAuthSignInToken if defined?(::AddAuthSignInToken)
24
40
  models[:notification] = ::AddAuthSecurityEvent if defined?(::AddAuthSecurityEvent)
41
+ models[:account] = ::AddAuthAccountToken if defined?(::AddAuthAccountToken)
25
42
  stores = models.filter_map do |kind, model|
26
43
  [kind, AddAuth::Rails::Stores::Maintenance.new(model: model, kind: kind)] if model.table_exists?
27
44
  end.to_h
28
- jobs = {email: AddAuth::EmailDeliveryJob, notification: AddAuth::SecurityNotificationJob}
45
+ jobs = {email: AddAuth::EmailDeliveryJob, notification: AddAuth::SecurityNotificationJob, account: AddAuth::AccountDeliveryJob}
29
46
  enqueue = lambda do |kind, id|
30
47
  raise AddAuth::Error, "maintenance enqueue failed" unless jobs.fetch(kind).perform_later(id)
31
48
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: add_auth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taimoor Qureshi
@@ -23,6 +23,20 @@ dependencies:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
25
  version: '8.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: json
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "<"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.0'
26
40
  - !ruby/object:Gem::Dependency
27
41
  name: webauthn
28
42
  requirement: !ruby/object:Gem::Requirement
@@ -203,10 +217,13 @@ description: |
203
217
  reauthentication and recovery. It adds hardened sessions, security mail and
204
218
  challenge providers, with shared Turbo/HTML pages and permitted no-JavaScript
205
219
  alternatives. It upgrades the generated User and Session models in place.
220
+ Optional account lifecycle, Devise migration, provider-library integration
221
+ and finite native sessions share the same account and session policies.
206
222
  Documentation: https://addauthgem.com.
207
223
  email:
208
224
  - taimoorq@gmail.com
209
- executables: []
225
+ executables:
226
+ - add_auth-preflight
210
227
  extensions: []
211
228
  extra_rdoc_files: []
212
229
  files:
@@ -216,24 +233,46 @@ files:
216
233
  - README.md
217
234
  - ROADMAP.md
218
235
  - SECURITY.md
236
+ - app/controllers/add_auth/accounts_controller.rb
219
237
  - app/controllers/add_auth/assets_controller.rb
238
+ - app/controllers/add_auth/external_identities_controller.rb
239
+ - app/controllers/add_auth/mobile_sessions_controller.rb
220
240
  - app/controllers/add_auth/passkeys_controller.rb
241
+ - app/controllers/add_auth/provider_sign_ins_controller.rb
221
242
  - app/controllers/add_auth/reauthentications_controller.rb
222
243
  - app/controllers/add_auth/recoveries_controller.rb
223
244
  - app/controllers/add_auth/sessions_controller.rb
224
245
  - app/controllers/add_auth/sign_ins_controller.rb
225
246
  - app/helpers/add_auth/sign_ins_helper.rb
226
247
  - app/javascript/controllers/.keep
248
+ - app/jobs/add_auth/account_delivery_job.rb
249
+ - app/jobs/add_auth/account_request_job.rb
227
250
  - app/jobs/add_auth/delivery_job.rb
228
251
  - app/jobs/add_auth/email_delivery_job.rb
229
252
  - app/jobs/add_auth/email_request_job.rb
230
253
  - app/jobs/add_auth/security_notification_job.rb
254
+ - app/mailers/add_auth/account_mailer.rb
231
255
  - app/mailers/add_auth/security_mailer.rb
232
256
  - app/mailers/add_auth/sign_in_mailer.rb
233
257
  - app/models/concerns/.keep
234
258
  - app/views/.keep
259
+ - app/views/add_auth/account_mailer/link.text.erb
260
+ - app/views/add_auth/accounts/_check_email.html.erb
261
+ - app/views/add_auth/accounts/_delete.html.erb
262
+ - app/views/add_auth/accounts/_email.html.erb
263
+ - app/views/add_auth/accounts/_invalid_proof.html.erb
264
+ - app/views/add_auth/accounts/_password.html.erb
265
+ - app/views/add_auth/accounts/_proof.html.erb
266
+ - app/views/add_auth/accounts/_register.html.erb
267
+ - app/views/add_auth/accounts/_request.html.erb
268
+ - app/views/add_auth/accounts/_unavailable.html.erb
269
+ - app/views/add_auth/external_identities/_index.html.erb
270
+ - app/views/add_auth/external_identities/_unavailable.html.erb
235
271
  - app/views/add_auth/passkeys/_controls.html.erb
236
272
  - app/views/add_auth/passkeys/_list.html.erb
273
+ - app/views/add_auth/provider_sign_ins/_enrollment.html.erb
274
+ - app/views/add_auth/provider_sign_ins/_failure.html.erb
275
+ - app/views/add_auth/provider_sign_ins/_prepare.html.erb
237
276
  - app/views/add_auth/reauthentications/_check_email.html.erb
238
277
  - app/views/add_auth/reauthentications/_confirmation.html.erb
239
278
  - app/views/add_auth/reauthentications/_different_browser.html.erb
@@ -253,11 +292,15 @@ files:
253
292
  - app/views/add_auth/sign_ins/_different_browser.html.erb
254
293
  - app/views/add_auth/sign_ins/_form.html.erb
255
294
  - app/views/add_auth/sign_ins/_invalid_link.html.erb
295
+ - app/views/add_auth/sign_ins/_remember.html.erb
256
296
  - app/views/add_auth/sign_ins/show.html.erb
257
297
  - app/views/layouts/add_auth/authentication.html.erb
298
+ - exe/add_auth-preflight
258
299
  - lib/add_auth.rb
259
300
  - lib/add_auth/configuration.rb
260
301
  - lib/add_auth/core/access_policy.rb
302
+ - lib/add_auth/core/account_lifecycle.rb
303
+ - lib/add_auth/core/account_policy.rb
261
304
  - lib/add_auth/core/browser_binding.rb
262
305
  - lib/add_auth/core/challenge/base.rb
263
306
  - lib/add_auth/core/challenge/http.rb
@@ -268,14 +311,30 @@ files:
268
311
  - lib/add_auth/core/delivery.rb
269
312
  - lib/add_auth/core/digest/base.rb
270
313
  - lib/add_auth/core/digest/hmac.rb
314
+ - lib/add_auth/core/external_identities.rb
315
+ - lib/add_auth/core/external_identities/evidence.rb
271
316
  - lib/add_auth/core/intake.rb
272
317
  - lib/add_auth/core/maintenance.rb
318
+ - lib/add_auth/core/migration/account_adoption.rb
319
+ - lib/add_auth/core/migration/readiness.rb
320
+ - lib/add_auth/core/mobile_authentication.rb
321
+ - lib/add_auth/core/mobile_handoffs.rb
322
+ - lib/add_auth/core/mobile_profile.rb
323
+ - lib/add_auth/core/mobile_response.rb
324
+ - lib/add_auth/core/native_authentication.rb
325
+ - lib/add_auth/core/passwords/bcrypt_support.rb
326
+ - lib/add_auth/core/passwords/credential.rb
327
+ - lib/add_auth/core/passwords/legacy_bcrypt.rb
328
+ - lib/add_auth/core/passwords/lifecycle.rb
273
329
  - lib/add_auth/core/rate_limit.rb
330
+ - lib/add_auth/core/remaining_factors.rb
274
331
  - lib/add_auth/core/security_events.rb
275
332
  - lib/add_auth/core/sessions.rb
276
333
  - lib/add_auth/core/step_up.rb
277
334
  - lib/add_auth/core/strategies/email_link.rb
278
335
  - lib/add_auth/core/strategies/passkey.rb
336
+ - lib/add_auth/migration/static_inventory.rb
337
+ - lib/add_auth/rails/account_password_entry.rb
279
338
  - lib/add_auth/rails/authentication.rb
280
339
  - lib/add_auth/rails/authentication_pages.rb
281
340
  - lib/add_auth/rails/delivery_cipher.rb
@@ -283,13 +342,33 @@ files:
283
342
  - lib/add_auth/rails/ejection.rb
284
343
  - lib/add_auth/rails/elevation.rb
285
344
  - lib/add_auth/rails/engine.rb
345
+ - lib/add_auth/rails/migration/account_store.rb
346
+ - lib/add_auth/rails/migration/effective_inventory.rb
347
+ - lib/add_auth/rails/migration/key_type.rb
348
+ - lib/add_auth/rails/migration/source_bridge.rb
349
+ - lib/add_auth/rails/password_adoption.rb
286
350
  - lib/add_auth/rails/password_entry.rb
351
+ - lib/add_auth/rails/provider_enrollment.rb
352
+ - lib/add_auth/rails/provider_libraries/apple_form_post_correlation.rb
353
+ - lib/add_auth/rails/provider_libraries/apple_jwks.rb
354
+ - lib/add_auth/rails/provider_libraries/apple_native.rb
355
+ - lib/add_auth/rails/provider_libraries/callback_route.rb
356
+ - lib/add_auth/rails/provider_libraries/omniauth.rb
357
+ - lib/add_auth/rails/provider_libraries/omniauth_correlation.rb
358
+ - lib/add_auth/rails/provider_libraries/openid_connect.rb
359
+ - lib/add_auth/rails/provider_libraries/request_protection.rb
287
360
  - lib/add_auth/rails/rate_limit_cache.rb
288
361
  - lib/add_auth/rails/runtime.rb
362
+ - lib/add_auth/rails/stores/account_credentials.rb
289
363
  - lib/add_auth/rails/stores/account_lock.rb
364
+ - lib/add_auth/rails/stores/account_tokens.rb
365
+ - lib/add_auth/rails/stores/authority.rb
366
+ - lib/add_auth/rails/stores/commit_dispatch.rb
290
367
  - lib/add_auth/rails/stores/delivery_state.rb
291
368
  - lib/add_auth/rails/stores/email_tokens.rb
369
+ - lib/add_auth/rails/stores/external_identities.rb
292
370
  - lib/add_auth/rails/stores/maintenance.rb
371
+ - lib/add_auth/rails/stores/mobile_handoffs.rb
293
372
  - lib/add_auth/rails/stores/passkeys.rb
294
373
  - lib/add_auth/rails/stores/security_events.rb
295
374
  - lib/add_auth/rails/stores/sessions.rb
@@ -297,10 +376,17 @@ files:
297
376
  - lib/add_auth/result.rb
298
377
  - lib/add_auth/testing.rb
299
378
  - lib/add_auth/version.rb
379
+ - lib/generators/add_auth/accounts/accounts_generator.rb
380
+ - lib/generators/add_auth/accounts/templates/add_add_auth_accounts.rb.tt
381
+ - lib/generators/add_auth/accounts/templates/add_add_auth_provisioning.rb.tt
382
+ - lib/generators/add_auth/accounts/templates/add_auth_account_token.rb
383
+ - lib/generators/add_auth/accounts/templates/add_auth_address_claim.rb
300
384
  - lib/generators/add_auth/challenge/challenge_generator.rb
301
385
  - lib/generators/add_auth/challenge/templates/recaptcha.rb.tt
302
386
  - lib/generators/add_auth/challenge/templates/turnstile.rb.tt
303
387
  - lib/generators/add_auth/controllers/controllers_generator.rb
388
+ - lib/generators/add_auth/devise_accounts/devise_accounts_generator.rb
389
+ - lib/generators/add_auth/devise_accounts/templates/prepare_add_auth_devise_accounts.rb.tt
304
390
  - lib/generators/add_auth/ejection.rb
305
391
  - lib/generators/add_auth/email_link/email_link_generator.rb
306
392
  - lib/generators/add_auth/email_link/templates/add_add_auth_email_binding.rb.tt
@@ -310,6 +396,14 @@ files:
310
396
  - lib/generators/add_auth/email_tokens/email_tokens_generator.rb
311
397
  - lib/generators/add_auth/email_tokens/templates/add_auth_sign_in_token.rb
312
398
  - lib/generators/add_auth/email_tokens/templates/create_add_auth_sign_in_tokens.rb.tt
399
+ - lib/generators/add_auth/external_identities/external_identities_generator.rb
400
+ - lib/generators/add_auth/external_identities/templates/add_add_auth_external_enrollment.rb.tt
401
+ - lib/generators/add_auth/external_identities/templates/add_add_auth_external_identity_validity.rb.tt
402
+ - lib/generators/add_auth/external_identities/templates/add_auth_external_identity.rb
403
+ - lib/generators/add_auth/external_identities/templates/add_auth_external_transaction.rb
404
+ - lib/generators/add_auth/external_identities/templates/create_add_auth_external_identities.rb.tt
405
+ - lib/generators/add_auth/external_identities/templates/providers.rb
406
+ - lib/generators/add_auth/feature_configuration.rb
313
407
  - lib/generators/add_auth/install/install_generator.rb
314
408
  - lib/generators/add_auth/install/templates/initializer.rb
315
409
  - lib/generators/add_auth/javascript/javascript_generator.rb
@@ -317,6 +411,11 @@ files:
317
411
  - lib/generators/add_auth/javascript/templates/codec.js
318
412
  - lib/generators/add_auth/javascript/templates/passkey.js
319
413
  - lib/generators/add_auth/mailer_views/mailer_views_generator.rb
414
+ - lib/generators/add_auth/mobile_sessions/mobile_sessions_generator.rb
415
+ - lib/generators/add_auth/mobile_sessions/templates/add_add_auth_mobile_sessions.rb.tt
416
+ - lib/generators/add_auth/mobile_sessions/templates/add_auth_mobile_handoff.rb
417
+ - lib/generators/add_auth/mobile_sessions/templates/create_add_auth_mobile_handoffs.rb.tt
418
+ - lib/generators/add_auth/mobile_sessions/templates/mobile.rb
320
419
  - lib/generators/add_auth/notifications/notifications_generator.rb
321
420
  - lib/generators/add_auth/notifications/templates/add_auth_security_event.rb
322
421
  - lib/generators/add_auth/notifications/templates/create_add_auth_security_events.rb.tt