add_auth 0.2.1 → 0.3.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 +4 -4
- data/CHANGELOG.md +36 -0
- data/README.md +57 -18
- data/ROADMAP.md +260 -242
- data/SECURITY.md +6 -0
- data/app/controllers/add_auth/accounts_controller.rb +138 -0
- data/app/controllers/add_auth/assets_controller.rb +2 -1
- data/app/controllers/add_auth/external_identities_controller.rb +56 -0
- data/app/controllers/add_auth/mobile_sessions_controller.rb +120 -0
- data/app/controllers/add_auth/provider_sign_ins_controller.rb +248 -0
- data/app/helpers/add_auth/sign_ins_helper.rb +2 -1
- data/app/jobs/add_auth/account_delivery_job.rb +14 -0
- data/app/jobs/add_auth/account_request_job.rb +17 -0
- data/app/mailers/add_auth/account_mailer.rb +12 -0
- data/app/views/add_auth/account_mailer/link.text.erb +7 -0
- data/app/views/add_auth/accounts/_check_email.html.erb +5 -0
- data/app/views/add_auth/accounts/_delete.html.erb +6 -0
- data/app/views/add_auth/accounts/_email.html.erb +12 -0
- data/app/views/add_auth/accounts/_invalid_proof.html.erb +5 -0
- data/app/views/add_auth/accounts/_password.html.erb +12 -0
- data/app/views/add_auth/accounts/_proof.html.erb +16 -0
- data/app/views/add_auth/accounts/_register.html.erb +17 -0
- data/app/views/add_auth/accounts/_request.html.erb +14 -0
- data/app/views/add_auth/accounts/_unavailable.html.erb +3 -0
- data/app/views/add_auth/external_identities/_index.html.erb +22 -0
- data/app/views/add_auth/external_identities/_unavailable.html.erb +3 -0
- data/app/views/add_auth/passkeys/_controls.html.erb +3 -1
- data/app/views/add_auth/provider_sign_ins/_enrollment.html.erb +12 -0
- data/app/views/add_auth/provider_sign_ins/_failure.html.erb +3 -0
- data/app/views/add_auth/provider_sign_ins/_prepare.html.erb +7 -0
- data/app/views/add_auth/reauthentications/_form.html.erb +9 -0
- data/app/views/add_auth/sessions/_list.html.erb +1 -1
- data/app/views/add_auth/sessions/index.html.erb +7 -0
- data/app/views/add_auth/sign_ins/_confirmation.html.erb +1 -0
- data/app/views/add_auth/sign_ins/_form.html.erb +17 -0
- data/app/views/add_auth/sign_ins/_remember.html.erb +6 -0
- data/app/views/layouts/add_auth/authentication.html.erb +4 -3
- data/exe/add_auth-preflight +26 -0
- data/lib/add_auth/configuration.rb +78 -4
- data/lib/add_auth/core/access_policy.rb +11 -1
- data/lib/add_auth/core/account_lifecycle.rb +251 -0
- data/lib/add_auth/core/account_policy.rb +50 -0
- data/lib/add_auth/core/external_identities/evidence.rb +98 -0
- data/lib/add_auth/core/external_identities.rb +278 -0
- data/lib/add_auth/core/intake.rb +6 -1
- data/lib/add_auth/core/maintenance.rb +5 -3
- data/lib/add_auth/core/migration/account_adoption.rb +79 -0
- data/lib/add_auth/core/migration/readiness.rb +41 -0
- data/lib/add_auth/core/mobile_authentication.rb +35 -0
- data/lib/add_auth/core/mobile_handoffs.rb +83 -0
- data/lib/add_auth/core/mobile_profile.rb +46 -0
- data/lib/add_auth/core/mobile_response.rb +12 -0
- data/lib/add_auth/core/native_authentication.rb +77 -0
- data/lib/add_auth/core/passwords/bcrypt_support.rb +28 -0
- data/lib/add_auth/core/passwords/credential.rb +49 -0
- data/lib/add_auth/core/passwords/legacy_bcrypt.rb +43 -0
- data/lib/add_auth/core/passwords/lifecycle.rb +60 -0
- data/lib/add_auth/core/remaining_factors.rb +24 -0
- data/lib/add_auth/core/sessions.rb +102 -17
- data/lib/add_auth/core/step_up.rb +13 -1
- data/lib/add_auth/migration/static_inventory.rb +116 -0
- data/lib/add_auth/rails/account_password_entry.rb +24 -0
- data/lib/add_auth/rails/authentication.rb +1 -1
- data/lib/add_auth/rails/authentication_pages.rb +5 -0
- data/lib/add_auth/rails/doctor.rb +73 -3
- data/lib/add_auth/rails/ejection.rb +1 -1
- data/lib/add_auth/rails/engine.rb +6 -1
- data/lib/add_auth/rails/migration/account_store.rb +41 -0
- data/lib/add_auth/rails/migration/effective_inventory.rb +162 -0
- data/lib/add_auth/rails/migration/key_type.rb +23 -0
- data/lib/add_auth/rails/migration/source_bridge.rb +53 -0
- data/lib/add_auth/rails/password_adoption.rb +37 -0
- data/lib/add_auth/rails/provider_enrollment.rb +61 -0
- data/lib/add_auth/rails/provider_libraries/apple_form_post_correlation.rb +127 -0
- data/lib/add_auth/rails/provider_libraries/apple_jwks.rb +68 -0
- data/lib/add_auth/rails/provider_libraries/apple_native.rb +55 -0
- data/lib/add_auth/rails/provider_libraries/callback_route.rb +16 -0
- data/lib/add_auth/rails/provider_libraries/omniauth.rb +136 -0
- data/lib/add_auth/rails/provider_libraries/omniauth_correlation.rb +107 -0
- data/lib/add_auth/rails/provider_libraries/openid_connect.rb +62 -0
- data/lib/add_auth/rails/provider_libraries/request_protection.rb +43 -0
- data/lib/add_auth/rails/rate_limit_cache.rb +17 -0
- data/lib/add_auth/rails/runtime.rb +173 -9
- data/lib/add_auth/rails/stores/account_credentials.rb +44 -0
- data/lib/add_auth/rails/stores/account_lock.rb +16 -7
- data/lib/add_auth/rails/stores/account_tokens.rb +96 -0
- data/lib/add_auth/rails/stores/authority.rb +28 -0
- data/lib/add_auth/rails/stores/commit_dispatch.rb +32 -0
- data/lib/add_auth/rails/stores/external_identities.rb +91 -0
- data/lib/add_auth/rails/stores/maintenance.rb +1 -1
- data/lib/add_auth/rails/stores/mobile_handoffs.rb +53 -0
- data/lib/add_auth/rails/stores/security_events.rb +3 -6
- data/lib/add_auth/rails/user_lifecycle.rb +8 -10
- data/lib/add_auth/result.rb +1 -0
- data/lib/add_auth/version.rb +1 -1
- data/lib/add_auth.rb +4 -0
- data/lib/generators/add_auth/accounts/accounts_generator.rb +52 -0
- data/lib/generators/add_auth/accounts/templates/add_add_auth_accounts.rb.tt +49 -0
- data/lib/generators/add_auth/accounts/templates/add_auth_account_token.rb +6 -0
- data/lib/generators/add_auth/accounts/templates/add_auth_address_claim.rb +6 -0
- data/lib/generators/add_auth/devise_accounts/devise_accounts_generator.rb +23 -0
- data/lib/generators/add_auth/devise_accounts/templates/prepare_add_auth_devise_accounts.rb.tt +17 -0
- data/lib/generators/add_auth/email_link/templates/add_auth_challenge.js +1 -0
- data/lib/generators/add_auth/email_tokens/templates/create_add_auth_sign_in_tokens.rb.tt +3 -1
- data/lib/generators/add_auth/external_identities/external_identities_generator.rb +52 -0
- data/lib/generators/add_auth/external_identities/templates/add_add_auth_external_enrollment.rb.tt +5 -0
- data/lib/generators/add_auth/external_identities/templates/add_add_auth_external_identity_validity.rb.tt +5 -0
- data/lib/generators/add_auth/external_identities/templates/add_auth_external_identity.rb +4 -0
- data/lib/generators/add_auth/external_identities/templates/add_auth_external_transaction.rb +6 -0
- data/lib/generators/add_auth/external_identities/templates/create_add_auth_external_identities.rb.tt +50 -0
- data/lib/generators/add_auth/external_identities/templates/providers.rb +51 -0
- data/lib/generators/add_auth/install/templates/initializer.rb +7 -1
- data/lib/generators/add_auth/javascript/templates/passkey.js +8 -5
- data/lib/generators/add_auth/mobile_sessions/mobile_sessions_generator.rb +48 -0
- data/lib/generators/add_auth/mobile_sessions/templates/add_add_auth_mobile_sessions.rb.tt +9 -0
- data/lib/generators/add_auth/mobile_sessions/templates/add_auth_mobile_handoff.rb +5 -0
- data/lib/generators/add_auth/mobile_sessions/templates/create_add_auth_mobile_handoffs.rb.tt +27 -0
- data/lib/generators/add_auth/mobile_sessions/templates/mobile.rb +8 -0
- data/lib/generators/add_auth/notifications/templates/create_add_auth_security_events.rb.tt +3 -1
- data/lib/generators/add_auth/passkeys/templates/add_add_auth_passkeys.rb.tt +7 -3
- data/lib/generators/add_auth/step_up/templates/add_add_auth_reauthentication.rb.tt +3 -1
- data/lib/tasks/add_auth.rake +18 -1
- metadata +86 -2
data/ROADMAP.md
CHANGED
|
@@ -1,244 +1,262 @@
|
|
|
1
1
|
# Roadmap
|
|
2
2
|
|
|
3
|
-
AddAuth extends Rails 8's
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
and
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
- [x]
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
- [x]
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
- [x]
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
- [x]
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
- [x]
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
-
|
|
123
|
-
|
|
124
|
-
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
##
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
- [x] Password
|
|
139
|
-
|
|
140
|
-
- [x]
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
- [
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
and
|
|
175
|
-
- [
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
- [
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
- [
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
- [x]
|
|
236
|
-
|
|
237
|
-
- [x]
|
|
238
|
-
|
|
239
|
-
- [
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
- [
|
|
244
|
-
|
|
3
|
+
AddAuth extends Rails 8's authentication generator with email-link sign-in,
|
|
4
|
+
passkeys, purpose-bound reauthentication, hardened sessions and pluggable captcha.
|
|
5
|
+
It reuses the host's accounts and Session model.
|
|
6
|
+
|
|
7
|
+
**Reviewed 2026-09-09: 0.2.2 is published, and the planned v1 strategy features
|
|
8
|
+
have shipped.** The bounded Devise migration and native additions below are locally verified
|
|
9
|
+
and selected for 0.3.0. The future 1.0 support commitment remains separate. Milestones below describe priorities, not promised dates or
|
|
10
|
+
versions. See [release status](https://addauthgem.com/release-status/),
|
|
11
|
+
[the changelog](CHANGELOG.md) and [the manual](https://addauthgem.com/).
|
|
12
|
+
|
|
13
|
+
**[0.2.2 is published and verified](https://github.com/taimoorq/add_auth/releases/tag/v0.2.2).**
|
|
14
|
+
It contains the counter-store correction and upgrade/operations coverage below.
|
|
15
|
+
The registry package passes fresh-host installation and the matching manual is
|
|
16
|
+
live. The owner selected this patch before accepting the proposed 1.0 commitment.
|
|
17
|
+
|
|
18
|
+
An unchecked item is remaining work; deferred candidates need a scope decision
|
|
19
|
+
before implementation. Checked features have passing relevant acceptance specs.
|
|
20
|
+
Other completed work requires its applicable verification evidence. Checkmarks
|
|
21
|
+
can describe tested local work; release/publication remains a separate gate. Detailed
|
|
22
|
+
design and decision records remain in the companion private planning workspace;
|
|
23
|
+
this public checklist is derived from its section 14 and stands on its own.
|
|
24
|
+
|
|
25
|
+
## Now — maintain 0.2 and learn from adoption
|
|
26
|
+
|
|
27
|
+
- [x] **R1 · Resolve the outstanding dependency update.**
|
|
28
|
+
[PR #9](https://github.com/taimoorq/add_auth/pull/9) updates the immutable
|
|
29
|
+
checkout pin to 7.0.1 with current required checks passing. Old Dependabot
|
|
30
|
+
PR #1 is closed as superseded. All merge/release protections remain in force.
|
|
31
|
+
- [x] **R1 · Complete the 2026-09-07 currency review.** Review Rails/Ruby support,
|
|
32
|
+
authentication APIs, WebAuthn, advisories and the competitive landscape
|
|
33
|
+
before the next version bump; repeat the standing review at least quarterly.
|
|
34
|
+
Floors remain Ruby 3.3 / Rails 8.0; current audits are clear. Follow Rails-
|
|
35
|
+
native password hashing when the supported API permits it. Future reviews
|
|
36
|
+
remain an ongoing maintenance responsibility.
|
|
37
|
+
- [x] **R2 · Complete a bounded first-adopter feedback review.** Official-package
|
|
38
|
+
local integration already passes. Collect installation, sign-in/recovery,
|
|
39
|
+
customization and operational friction; give each finding a gem fix,
|
|
40
|
+
documentation improvement, host-owned resolution or explicit deferral.
|
|
41
|
+
The review dispositions existing passwordless/management fixes, host-owned
|
|
42
|
+
onboarding/roles/mail branding and the new upgrade/operations guidance.
|
|
43
|
+
Stock and synthetic host regressions remain required for reusable changes.
|
|
44
|
+
- [x] **R2 · Improve onboarding from observed friction.** Update existing
|
|
45
|
+
quickstart, doctor and troubleshooting guidance with exact prerequisites,
|
|
46
|
+
observable success and recovery steps. Keep the public manual tied to the
|
|
47
|
+
published package. Upgrade, compatibility, cache and ejection guidance is
|
|
48
|
+
published for 0.2.2; build, browser and live deployment checks pass.
|
|
49
|
+
|
|
50
|
+
The exact 0.2.2 release commit passed the full CI matrix and CodeQL. The post-publication
|
|
51
|
+
passwordless-fixture isolation failure is fixed in
|
|
52
|
+
[PR #8](https://github.com/taimoorq/add_auth/pull/8); it is not an open runtime
|
|
53
|
+
defect or a reason by itself to republish 0.2.1.
|
|
54
|
+
|
|
55
|
+
## Next — prove upgrades, plan migrations and define the 1.0 contract
|
|
56
|
+
|
|
57
|
+
- [x] **R3 · Rehearse an upgrade from published 0.2.1.** Start with a populated
|
|
58
|
+
host, active sessions, passkeys, strict accounts, pending mail and customized
|
|
59
|
+
ejected files. Upgrade to the candidate and verify data/policy preservation,
|
|
60
|
+
migration repeatability, doctor diffs, reviewed baseline acceptance,
|
|
61
|
+
worker compatibility and safe rollback or explicit revocation. Keep
|
|
62
|
+
fresh-install and before/after-ejection coverage. The checksum-pinned
|
|
63
|
+
baseline/candidate/rollback test passes on all six Ruby/Rails combinations;
|
|
64
|
+
CI now includes the same rehearsal.
|
|
65
|
+
- [x] **R4 · Validate the Rails-default operations path.** Exercise Solid Queue
|
|
66
|
+
restart/enqueue failure and same-intent mail retry locally. Determine
|
|
67
|
+
whether Solid Cache meets atomic rate-limit increment/TTL requirements;
|
|
68
|
+
document a tested separate store if needed. Publish only verified adapter
|
|
69
|
+
support. Solid Queue 1.7.0 passes with a separate queue database. Solid
|
|
70
|
+
Cache 1.0.10 loses concurrent first increments on PostgreSQL; 0.2.2
|
|
71
|
+
rejects it for abuse counters and documents a separate Redis store.
|
|
72
|
+
- [x] **R4 · Measure bounded maintenance and recovery.** Record workload,
|
|
73
|
+
query counts, backlog drain and latency for session pages, outbox retries
|
|
74
|
+
and cleanup. Use those measurements to explain batch sizing, retention,
|
|
75
|
+
alerts and recovery procedures. SQLite/PostgreSQL rehearsals retain 5,000
|
|
76
|
+
live sessions while draining 1,200 expired rows in twelve batches of 100;
|
|
77
|
+
session listing uses two SELECTs and at most 52 loaded Session records.
|
|
78
|
+
- [x] **R5 · Inventory the proposed stable public surface.** Name supported configuration,
|
|
79
|
+
Core/host hooks and Results, routes, generators/ejection metadata, testing
|
|
80
|
+
helpers and redacted events. Distinguish internal APIs and document
|
|
81
|
+
compatibility, deprecation and migration rules. The current integration
|
|
82
|
+
reference is published; the proposed 1.0 contract remains for owner
|
|
83
|
+
review under the separate item below.
|
|
84
|
+
- [ ] **R5 · Set the 1.0 support policy.** Specify supported runtime/database
|
|
85
|
+
combinations and security-supported release lines. Publish an upgrade
|
|
86
|
+
guide and evidence-backed troubleshooting updates before the candidate
|
|
87
|
+
freezes. The current latest-0.x policy remains in
|
|
88
|
+
[SECURITY.md](SECURITY.md).
|
|
89
|
+
- [x] **R8 · Define Devise migration readiness.** Inventory source versions,
|
|
90
|
+
modules, extensions and customizations; provide a read-only preflight with
|
|
91
|
+
supported mappings, prerequisites and actionable blockers. Running Rails 8
|
|
92
|
+
alone does not establish the authentication contracts AddAuth needs.
|
|
93
|
+
- [x] **R8 · Provide a path for Rails-aligned Devise apps.** Reuse verified
|
|
94
|
+
account/session contracts and preserve host customizations while replacing
|
|
95
|
+
remaining Devise authentication wiring. Prove password compatibility,
|
|
96
|
+
account restrictions, session/token revocation and safe cutover/rollback.
|
|
97
|
+
- [x] **R8 · Provide a path for standard or customized Devise apps.** Guide an
|
|
98
|
+
additive conversion from existing models, identifiers, password storage
|
|
99
|
+
and controllers to the supported Rails contracts. Preserve account IDs and
|
|
100
|
+
associations; resolve incompatible hashes, identifier collisions and
|
|
101
|
+
unsupported module policies before cutover. Include older-runtime
|
|
102
|
+
prerequisites and host-owned lifecycle replacements where needed.
|
|
103
|
+
- [x] **R8 · Add optional account lifecycle support.** Registration,
|
|
104
|
+
confirmation/reconfirmation, password reset, lock/unlock and account
|
|
105
|
+
changes must preserve ownership, account policy and session revocation.
|
|
106
|
+
- [x] **R8 · Preserve provider sign-in through maintained libraries.** Add
|
|
107
|
+
optional OmniAuth integration with verified identity binding, explicit
|
|
108
|
+
linking/unlinking and usable recovery for provider-only accounts.
|
|
109
|
+
Preserve host-owned OAuth configuration, routes and other provider flows;
|
|
110
|
+
delegate protocol work to the selected libraries.
|
|
111
|
+
- [x] **R8 · Rehearse both migration paths and draft the guides.** Test populated Devise
|
|
112
|
+
hosts before and after migration, including custom schema, peppered
|
|
113
|
+
passwords, denied accounts, interrupted conversion and rollback. Verify
|
|
114
|
+
supported database/runtime, ordinary HTML with JavaScript and Turbo absent,
|
|
115
|
+
Turbo enhancement and permitted no-JS journeys. Draft step-by-step guides
|
|
116
|
+
and prove the destination works with Devise removed.
|
|
117
|
+
- [ ] **R8 · Publish migration and native guides with the feature release.**
|
|
118
|
+
Verify the released package, installation commands, HTTPS and deep links;
|
|
119
|
+
keep development guides explicitly unpublished until then.
|
|
120
|
+
|
|
121
|
+
Local development has verified preflight, optional account lifecycle and
|
|
122
|
+
provider-library integration across the supported Ruby/Rails matrix, including
|
|
123
|
+
ordinary HTML, Turbo and permitted no-JS journeys. These additions are
|
|
124
|
+
unpublished. Migration/checkpoint/compatible-rollback tests and native client
|
|
125
|
+
acceptance are complete locally. The full adopter suite passes 1,330 examples
|
|
126
|
+
with zero failures and three existing empty scaffold examples pending. Six
|
|
127
|
+
development guides pass build, browser, keyboard and no-JS checks. Publication
|
|
128
|
+
and the proposed 1.0 commitment remain separate gates.
|
|
129
|
+
|
|
130
|
+
## Locally verified — Android and iOS login
|
|
131
|
+
|
|
132
|
+
Mobile support is now part of the active migration implementation. It is not available in the published gem. These capabilities extend the
|
|
133
|
+
same account and session policies. The verified finite profile uses explicit
|
|
134
|
+
30-day absolute and 14-day idle limits, with fresh sign-in after expiry. Renewable
|
|
135
|
+
refresh-token families remain a distinct optional capability, currently disabled.
|
|
136
|
+
The owner selected 0.3.0; publication and package verification remain pending.
|
|
137
|
+
|
|
138
|
+
- [x] **R8 · Password and provider login for native clients.** Return credentials
|
|
139
|
+
over authenticated HTTPS responses; preserve supported client contracts.
|
|
140
|
+
- [x] **R8 · Secure browser-to-app sign-in handoffs.** Short-lived, single-use
|
|
141
|
+
codes bound to state and a verifier, exact callback validation, and native
|
|
142
|
+
Apple nonce verification; no reusable bearer tokens in callback URLs.
|
|
143
|
+
- [x] **R8 · Device sessions and revocation.** Expiring, digested API credentials,
|
|
144
|
+
cookie/bearer separation, device listing, current-device and all-device
|
|
145
|
+
logout, and invalidation on password/account changes. Evaluate optional
|
|
146
|
+
renewal with rotation and replay detection as a distinct profile.
|
|
147
|
+
- [x] **R8 · Android/iOS migration acceptance.** Test secure client storage,
|
|
148
|
+
cancellation/restarts, account switching, expiry and concurrent handoffs,
|
|
149
|
+
plus supported old/new client combinations. Android/iOS consumers also
|
|
150
|
+
pass against an installed gem in an isolated Rails adopter over local HTTPS.
|
|
151
|
+
|
|
152
|
+
Each change owns its tests and keeps intermediate releases usable. R3/R4 findings
|
|
153
|
+
feed R5. A patch may address compatible corrections; another 0.x minor is possible
|
|
154
|
+
if integration contracts change. A 0.3 release is not a prerequisite for 1.0.
|
|
155
|
+
R8 follows the published 0.2.2 correction; its supported source profiles
|
|
156
|
+
are bounded to the verified Devise 5.0.4 fixtures. The selected delivery version is 0.3.0. Its pre-1.0 integration contracts
|
|
157
|
+
remain subject to review before R5 freezes. Devise migration support is not available yet.
|
|
158
|
+
|
|
159
|
+
## Delivery — 0.3.0 feature release, then the proposed 1.0 gate
|
|
160
|
+
|
|
161
|
+
- [x] Select 0.3.0 for the locally verified migration, lifecycle, provider and native scope.
|
|
162
|
+
- [ ] Pass required PR and exact default-branch CI/CodeQL for 0.3.0.
|
|
163
|
+
- [ ] Publish 0.3.0 through protected OIDC and verify the downloaded package and manual.
|
|
164
|
+
|
|
165
|
+
- [x] **R6 · Deliver the 0.2.2 correction.**
|
|
166
|
+
[PR #10](https://github.com/taimoorq/add_auth/pull/10) passed all required
|
|
167
|
+
checks, followed by exact default-branch CI and protected OIDC publication.
|
|
168
|
+
The downloaded package checksum and all 121 files match the reviewed
|
|
169
|
+
candidate; fresh-host installation and the matching public manual pass.
|
|
170
|
+
The existing latest-0.x support policy remains in effect.
|
|
171
|
+
|
|
172
|
+
- [ ] **R6 · Finish the adoption and compatibility review.** R1–R5 findings are
|
|
173
|
+
completed or explicitly dispositioned, the supported API is accepted, and
|
|
174
|
+
the published-package upgrade and documented operations profile pass.
|
|
175
|
+
- [ ] **R6 · Verify the exact candidate.** Preserve the complete local
|
|
176
|
+
Ruby/Rails, SQLite/PostgreSQL, generated/ejected browser and operations
|
|
177
|
+
acceptance; resolve release-blocking security and upgrade findings.
|
|
178
|
+
Recheck dependency currency and pass required GitHub CI/CodeQL controls.
|
|
179
|
+
- [ ] **R6 · Publish and verify 1.0.** Release notes, migration/support guidance,
|
|
180
|
+
protected OIDC publication, registry checksum/package verification, fresh
|
|
181
|
+
installation and the public manual all identify the same accepted release.
|
|
182
|
+
|
|
183
|
+
The owner accepted local testing as the gem release gate. Production migration,
|
|
184
|
+
a fixed number of adopters, live captcha accounts, physical devices and branded
|
|
185
|
+
emails are not additional gem release requirements. Hosts remain responsible for
|
|
186
|
+
their actual providers, proxy/TLS, trusted recovery addresses and support process.
|
|
187
|
+
|
|
188
|
+
## Ongoing — broader compatibility evidence
|
|
189
|
+
|
|
190
|
+
- [ ] **R7 · Record browser, device and accessibility results as available.**
|
|
191
|
+
Track exact Safari/Firefox/mobile/hybrid authenticator and
|
|
192
|
+
assistive-technology environments. Add local regressions for reproducible
|
|
193
|
+
defects and document limits.
|
|
194
|
+
- [ ] **R7 · Record deployment-provider results as available.** Capture actual
|
|
195
|
+
provider and failure/recovery evidence without treating local protocol
|
|
196
|
+
fixtures as live-service certification.
|
|
197
|
+
|
|
198
|
+
These broaden host deployment confidence; they do not reopen completed 0.2
|
|
199
|
+
acceptance or silently add hardware/service gates to 1.0.
|
|
200
|
+
|
|
201
|
+
## Later — evaluate demand before adding scope
|
|
202
|
+
|
|
203
|
+
These are candidates, not promised features or a committed “v2” release. A
|
|
204
|
+
compatible extension could ship in 1.x after an explicit scope decision.
|
|
205
|
+
|
|
206
|
+
- [ ] **F1 · Recovery codes.** First expansion candidate to assess when adopters
|
|
207
|
+
need recovery beyond trusted email or strict host support. Design single
|
|
208
|
+
use, regeneration/revocation, abuse controls and the recovery-policy boundary
|
|
209
|
+
before implementation; codes must not silently satisfy passkey-only purposes.
|
|
210
|
+
- [ ] **F2 · Rails-native password hashing integration.** Recheck available Rails
|
|
211
|
+
support and real adopter needs before adding an adapter or changing a default.
|
|
212
|
+
- [ ] **F3 · Account lifecycle helpers.** The bounded migration requirements
|
|
213
|
+
are promoted to R8 above; broader module parity remains outside this scope.
|
|
214
|
+
- [ ] **F4 · Multiple realms.** Require a concrete identity/session-isolation need
|
|
215
|
+
and migration design before adding models, cookies or routing APIs.
|
|
216
|
+
- [ ] **F4 · API/token authentication.** Android/iOS login is the active R8
|
|
217
|
+
work above; multiple realms and general API-key management remain separate.
|
|
218
|
+
- [ ] **F5 · Standalone test helpers or challenge adapters.** Extract only if
|
|
219
|
+
independent demand and maintenance capacity justify another package;
|
|
220
|
+
retain one implementation per concern.
|
|
221
|
+
|
|
222
|
+
Optional provider-library integration is locally verified under R8. SMS/TOTP and enterprise
|
|
223
|
+
or cross-origin WebAuthn remain outside the current roadmap. Account roles,
|
|
224
|
+
invitations, authorization and email branding
|
|
225
|
+
stay with the host.
|
|
226
|
+
|
|
227
|
+
## Shipped — 0.2.1 baseline
|
|
228
|
+
|
|
229
|
+
- [x] Host password integration and explicit passwordless mode; one Core policy,
|
|
230
|
+
result presenter and atomic session finalizer.
|
|
231
|
+
- [x] Random digested session bearers, bounded Rails signed-ID session adoption,
|
|
232
|
+
expiry, device listing/pagination, revoke-one/all and host lifecycle invalidation.
|
|
233
|
+
- [x] Email links with inert GET/explicit POST confirmation, generic intake,
|
|
234
|
+
resend/replay protection and optional same-browser binding.
|
|
235
|
+
- [x] Discoverable passkeys, conditional sign-in, UV/origin enforcement,
|
|
236
|
+
credential management, counter checks and atomic last-method protection.
|
|
237
|
+
- [x] Purpose-bound password/email/passkey reauthentication, trusted-address
|
|
238
|
+
recovery, strict opt-in policy and protected host mutations.
|
|
239
|
+
- [x] Durable encrypted mail/notification intents, leases, retries,
|
|
240
|
+
cancellation and bounded maintenance with optional retention.
|
|
241
|
+
- [x] Turnstile and reCAPTCHA v2/v3 with distinct rejected/unavailable outcomes,
|
|
242
|
+
bounded verification and explicit outage policy.
|
|
243
|
+
- [x] Additive generators, fingerprinted view/controller/JavaScript/mail ejection,
|
|
244
|
+
drift diagnostics, doctor and framework-neutral testing helpers.
|
|
245
|
+
- [x] Shared HTML/Turbo pages, permitted no-JS alternatives, browser
|
|
246
|
+
capability detection and cache/CSRF/privacy protections.
|
|
247
|
+
- [x] Local supported Ruby 3.3/3.4/4.0 × Rails 8.0/8.1 matrix, SQLite/PostgreSQL
|
|
248
|
+
concurrency, generated/ejected browser and SMTP/queue/cache acceptance.
|
|
249
|
+
- [x] RSpec, Standard, dependency audit, CodeQL, protected repository controls
|
|
250
|
+
and pinned-action Trusted Publishing.
|
|
251
|
+
- [x] [Published 0.2.1](https://rubygems.org/gems/add_auth/versions/0.2.1),
|
|
252
|
+
verified registry installation and the maintained public manual.
|
|
253
|
+
|
|
254
|
+
Passkeys require JavaScript and a capable browser. Configured captcha may also
|
|
255
|
+
require JavaScript; strict policy is never weakened to imitate no-JS parity.
|
|
256
|
+
The immutable 0.1.0/0.2.0 tags did not publish packages; 0.2.1 is the first
|
|
257
|
+
successful package release. Historical details remain in the changelog and
|
|
258
|
+
release records.
|
|
259
|
+
|
|
260
|
+
For application setup, start with the [quickstart](https://addauthgem.com/quickstart/).
|
|
261
|
+
Report bugs or adoption feedback through [public issues](https://github.com/taimoorq/add_auth/issues);
|
|
262
|
+
use [private vulnerability reporting](SECURITY.md) for security concerns.
|
data/SECURITY.md
CHANGED
|
@@ -34,6 +34,12 @@ mailing list, or social media) until a fix has been released.
|
|
|
34
34
|
replacement handling.
|
|
35
35
|
- Bounded session listing and authentication-history cleanup, including account
|
|
36
36
|
scoping, eligibility rechecks and active-delivery-lease protection.
|
|
37
|
+
- Optional account lifecycle and migration boundaries: credential
|
|
38
|
+
profile selection, source-write fencing, address ownership, account proofs,
|
|
39
|
+
policy and revocation. These capabilities are introduced in 0.3.0.
|
|
40
|
+
- Optional provider identity binding and mobile sessions/handoffs, including
|
|
41
|
+
nonce/client/purpose binding, exact callbacks, single use and bearer/cookie
|
|
42
|
+
separation. Provider protocol cryptography remains library-owned.
|
|
37
43
|
- The generated controllers and views this gem ships,
|
|
38
44
|
including their CSRF, enumeration-safety, and Turbo-Stream behavior.
|
|
39
45
|
- The GitHub Actions release pipeline (`.github/workflows/push_gem.yml`) and
|