rodauth 1.23.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +184 -0
- data/MIT-LICENSE +1 -1
- data/README.rdoc +221 -79
- data/doc/account_expiration.rdoc +12 -26
- data/doc/active_sessions.rdoc +49 -0
- data/doc/audit_logging.rdoc +44 -0
- data/doc/base.rdoc +76 -128
- data/doc/change_login.rdoc +7 -14
- data/doc/change_password.rdoc +9 -13
- data/doc/change_password_notify.rdoc +2 -2
- data/doc/close_account.rdoc +9 -16
- data/doc/confirm_password.rdoc +12 -5
- data/doc/create_account.rdoc +11 -22
- data/doc/disallow_password_reuse.rdoc +6 -13
- data/doc/email_auth.rdoc +15 -14
- data/doc/email_base.rdoc +5 -15
- data/doc/guides/admin_activation.rdoc +46 -0
- data/doc/guides/already_authenticated.rdoc +10 -0
- data/doc/guides/alternative_login.rdoc +46 -0
- data/doc/guides/create_account_programmatically.rdoc +38 -0
- data/doc/guides/delay_password.rdoc +25 -0
- data/doc/guides/email_only.rdoc +16 -0
- data/doc/guides/i18n.rdoc +26 -0
- data/doc/{internals.rdoc → guides/internals.rdoc} +0 -0
- data/doc/guides/links.rdoc +12 -0
- data/doc/guides/login_return.rdoc +37 -0
- data/doc/guides/password_column.rdoc +25 -0
- data/doc/guides/password_confirmation.rdoc +37 -0
- data/doc/guides/password_requirements.rdoc +30 -0
- data/doc/guides/paths.rdoc +36 -0
- data/doc/guides/query_params.rdoc +9 -0
- data/doc/guides/redirects.rdoc +17 -0
- data/doc/guides/registration_field.rdoc +68 -0
- data/doc/guides/require_mfa.rdoc +30 -0
- data/doc/guides/reset_password_autologin.rdoc +21 -0
- data/doc/guides/status_column.rdoc +28 -0
- data/doc/guides/totp_or_recovery.rdoc +16 -0
- data/doc/http_basic_auth.rdoc +10 -1
- data/doc/jwt.rdoc +22 -22
- data/doc/jwt_cors.rdoc +2 -3
- data/doc/jwt_refresh.rdoc +23 -8
- data/doc/lockout.rdoc +17 -15
- data/doc/login.rdoc +17 -2
- data/doc/login_password_requirements_base.rdoc +18 -37
- data/doc/logout.rdoc +2 -2
- data/doc/otp.rdoc +25 -19
- data/doc/password_complexity.rdoc +10 -26
- data/doc/password_expiration.rdoc +11 -25
- data/doc/password_grace_period.rdoc +16 -2
- data/doc/password_pepper.rdoc +44 -0
- data/doc/recovery_codes.rdoc +18 -12
- data/doc/release_notes/2.0.0.txt +361 -0
- data/doc/release_notes/2.1.0.txt +31 -0
- data/doc/release_notes/2.2.0.txt +39 -0
- data/doc/release_notes/2.3.0.txt +37 -0
- data/doc/release_notes/2.4.0.txt +22 -0
- data/doc/remember.rdoc +40 -64
- data/doc/reset_password.rdoc +12 -9
- data/doc/session_expiration.rdoc +1 -0
- data/doc/single_session.rdoc +16 -25
- data/doc/sms_codes.rdoc +24 -14
- data/doc/two_factor_base.rdoc +60 -22
- data/doc/verify_account.rdoc +14 -12
- data/doc/verify_account_grace_period.rdoc +6 -2
- data/doc/verify_login_change.rdoc +9 -8
- data/doc/webauthn.rdoc +115 -0
- data/doc/webauthn_login.rdoc +15 -0
- data/doc/webauthn_verify_account.rdoc +9 -0
- data/javascript/webauthn_auth.js +45 -0
- data/javascript/webauthn_setup.js +35 -0
- data/lib/roda/plugins/rodauth.rb +1 -1
- data/lib/rodauth.rb +33 -28
- data/lib/rodauth/features/account_expiration.rb +5 -5
- data/lib/rodauth/features/active_sessions.rb +158 -0
- data/lib/rodauth/features/audit_logging.rb +98 -0
- data/lib/rodauth/features/base.rb +152 -49
- data/lib/rodauth/features/change_password_notify.rb +1 -1
- data/lib/rodauth/features/close_account.rb +8 -6
- data/lib/rodauth/features/confirm_password.rb +40 -2
- data/lib/rodauth/features/create_account.rb +8 -13
- data/lib/rodauth/features/disallow_common_passwords.rb +1 -1
- data/lib/rodauth/features/disallow_password_reuse.rb +5 -3
- data/lib/rodauth/features/email_auth.rb +30 -28
- data/lib/rodauth/features/email_base.rb +3 -3
- data/lib/rodauth/features/http_basic_auth.rb +55 -35
- data/lib/rodauth/features/jwt.rb +63 -16
- data/lib/rodauth/features/jwt_cors.rb +15 -15
- data/lib/rodauth/features/jwt_refresh.rb +42 -13
- data/lib/rodauth/features/lockout.rb +11 -13
- data/lib/rodauth/features/login.rb +58 -13
- data/lib/rodauth/features/login_password_requirements_base.rb +13 -8
- data/lib/rodauth/features/otp.rb +76 -82
- data/lib/rodauth/features/password_complexity.rb +8 -13
- data/lib/rodauth/features/password_expiration.rb +1 -1
- data/lib/rodauth/features/password_grace_period.rb +17 -10
- data/lib/rodauth/features/password_pepper.rb +45 -0
- data/lib/rodauth/features/recovery_codes.rb +47 -51
- data/lib/rodauth/features/remember.rb +13 -27
- data/lib/rodauth/features/reset_password.rb +25 -25
- data/lib/rodauth/features/session_expiration.rb +7 -10
- data/lib/rodauth/features/single_session.rb +8 -6
- data/lib/rodauth/features/sms_codes.rb +58 -68
- data/lib/rodauth/features/two_factor_base.rb +134 -30
- data/lib/rodauth/features/verify_account.rb +28 -20
- data/lib/rodauth/features/verify_account_grace_period.rb +18 -9
- data/lib/rodauth/features/verify_login_change.rb +11 -10
- data/lib/rodauth/features/webauthn.rb +505 -0
- data/lib/rodauth/features/webauthn_login.rb +70 -0
- data/lib/rodauth/features/webauthn_verify_account.rb +46 -0
- data/lib/rodauth/migrations.rb +16 -5
- data/lib/rodauth/version.rb +2 -2
- data/templates/button.str +1 -3
- data/templates/change-login.str +1 -2
- data/templates/change-password.str +3 -5
- data/templates/close-account.str +2 -2
- data/templates/confirm-password.str +1 -1
- data/templates/create-account.str +1 -1
- data/templates/email-auth-request-form.str +1 -2
- data/templates/email-auth.str +1 -1
- data/templates/global-logout-field.str +6 -0
- data/templates/login-confirm-field.str +2 -4
- data/templates/login-display.str +3 -2
- data/templates/login-field.str +2 -4
- data/templates/login-form-footer.str +6 -0
- data/templates/login-form.str +7 -0
- data/templates/login.str +1 -9
- data/templates/logout.str +1 -1
- data/templates/multi-phase-login.str +3 -0
- data/templates/otp-auth-code-field.str +5 -3
- data/templates/otp-auth.str +1 -1
- data/templates/otp-disable.str +1 -1
- data/templates/otp-setup.str +3 -3
- data/templates/password-confirm-field.str +2 -4
- data/templates/password-field.str +2 -4
- data/templates/recovery-auth.str +3 -6
- data/templates/recovery-codes.str +1 -1
- data/templates/remember.str +15 -20
- data/templates/reset-password-request.str +2 -2
- data/templates/reset-password.str +1 -2
- data/templates/sms-auth.str +1 -1
- data/templates/sms-code-field.str +5 -3
- data/templates/sms-confirm.str +1 -2
- data/templates/sms-disable.str +1 -2
- data/templates/sms-request.str +1 -1
- data/templates/sms-setup.str +6 -4
- data/templates/two-factor-auth.str +5 -0
- data/templates/two-factor-disable.str +6 -0
- data/templates/two-factor-manage.str +16 -0
- data/templates/unlock-account-request.str +2 -2
- data/templates/unlock-account.str +1 -1
- data/templates/verify-account-resend.str +1 -1
- data/templates/verify-account.str +1 -2
- data/templates/verify-login-change.str +1 -1
- data/templates/webauthn-auth.str +11 -0
- data/templates/webauthn-remove.str +14 -0
- data/templates/webauthn-setup.str +12 -0
- metadata +96 -13
- data/doc/verify_change_login.rdoc +0 -11
- data/lib/rodauth/features/verify_change_login.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db02abed46d2dd511d07e2c8bf8640ca01f14fff595953a3c05b9a2cbe314511
|
4
|
+
data.tar.gz: 81f74322d49942d099789350c031c59227ec92b8eb6304dce9b4e15a91f2e60f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bda7da30406c315d6f467ac88701668c5288c93f8415bb1cffa280136cf7838a4fec81e865b8d0e607fef646df5d33a37e96f6e5e00dba2d6956757efc25ffc8
|
7
|
+
data.tar.gz: f19903ffb51eb7a87107fe0a24a33214fde275e732a6ac2a41e9bf3409f7b348c2ca8f9f87fe690d8b239fc5ae796f02a36ac32c7f615c8fca25f628d4173a80
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,187 @@
|
|
1
|
+
=== 2.4.0 (2020-09-21)
|
2
|
+
|
3
|
+
* Add session_key_prefix for more easily using separate session keys when using multiple configurations (janko) (#121)
|
4
|
+
|
5
|
+
* Add password_pepper feature for appending a secret key to passwords before they are hashed, supporting secret rotation (janko) (#119)
|
6
|
+
|
7
|
+
=== 2.3.0 (2020-08-21)
|
8
|
+
|
9
|
+
* Return an error status instead of an invalid access token when trying to refresh JWT without an access token in the jwt_refresh feature (jeremyevans)
|
10
|
+
|
11
|
+
* Allow {create,drop}_database_authentication_functions to work with UUID keys (monorkin, janko) (#117)
|
12
|
+
|
13
|
+
* Add rodauth.login('login_type') for logging in after setting a valid account (janko) (#114)
|
14
|
+
|
15
|
+
* Make new refresh token available to the after_refresh_token hook by setting it in the response first (jeremyevans)
|
16
|
+
|
17
|
+
* Make the jwt_refresh plugin call before_jwt_refresh_route hook (previously the configuration method was ignored) (AlexeyMatskevich) (#110)
|
18
|
+
|
19
|
+
* Add login_email_regexp, login_not_valid_email_message, and log_valid_email? configuration methods (janko) (#107)
|
20
|
+
|
21
|
+
=== 2.2.0 (2020-07-20)
|
22
|
+
|
23
|
+
* Allow removing all jwt_refresh tokens when logging out by providing a value of "all" as the token to remove (jeremyevans)
|
24
|
+
|
25
|
+
* Allow removing specific jwt_refresh token when logging out by providing the token to remove (jeremyevans)
|
26
|
+
|
27
|
+
* Avoid NoMethodError when checking if session is authenticated when using two factor auth, verify_account_grace_period, and email_auth (jeremyevans) (#105)
|
28
|
+
|
29
|
+
* Reduce queries in #authenticated? and #require_authentication when using two factor authentication (janko) (#106)
|
30
|
+
|
31
|
+
* Treat verify_account_email_resend returning false as an error in the verify_account feature (jeremyevans)
|
32
|
+
|
33
|
+
* Fix use of password_dictionary configuration method in password_complexity feature (jeremyevans)
|
34
|
+
|
35
|
+
* Remove unnecessary conditionals (jeremyevans)
|
36
|
+
|
37
|
+
* Add otp_last_use to the otp feature, returning the time of last successful OTP use (jeremyevans) (#103)
|
38
|
+
|
39
|
+
=== 2.1.0 (2020-06-09)
|
40
|
+
|
41
|
+
* Do not check CSRF tokens by default for requests using JWT (janko, jeremyevans) (#99)
|
42
|
+
|
43
|
+
* Use new-password autocomplete value for password field when creating accounts (jeremyevans) (#98)
|
44
|
+
|
45
|
+
* Consistently use json_response_body for all JSON responses in jwt feature (arthurmmoreira) (#97)
|
46
|
+
|
47
|
+
* Add check_csrf configuration method to customize CSRF checking (janko) (#96)
|
48
|
+
|
49
|
+
* Have logged_in? when using http_basic_auth feature check for basic authentication (jeremyevans) (#94)
|
50
|
+
|
51
|
+
* Don't consider account open if in unverified grace period without password (janko) (#92)
|
52
|
+
|
53
|
+
=== 2.0.0 (2020-05-06)
|
54
|
+
|
55
|
+
* Do not show email auth as an option for unverified accounts if using the verify_account_grace_period feature (jeremyevans) (#88)
|
56
|
+
|
57
|
+
* Generate unlock account key outside of send_unlock_account_email, similar to other email methods (janko) (#89)
|
58
|
+
|
59
|
+
* Default otp_drift to 30 in the otp feature (jeremyevans)
|
60
|
+
|
61
|
+
* Add rodauth.require_http_basic_auth to http_basic_auth feature, similar to require_login (janko) (#86)
|
62
|
+
|
63
|
+
* Rename require_http_basic_auth to require_http_basic_auth? in http_basic_auth feature (janko) (#86)
|
64
|
+
|
65
|
+
* Change http_basic_auth feature to use rodauth.http_basic_auth for handling basic authentication, similar to rodauth.load_memory (janko) (#86)
|
66
|
+
|
67
|
+
* Do not call already_logged_in if logged in when accessing verify_login_change page (janko) (#87)
|
68
|
+
|
69
|
+
* HTML id attributes now use - instead of _ in recovery_codes and remember features (jeremyevans)
|
70
|
+
|
71
|
+
* Allow *_path and *_url methods to accept a hash of query parameters (janko) (#84)
|
72
|
+
|
73
|
+
* Use a danger button when closing accounts (janko) (#83)
|
74
|
+
|
75
|
+
* Handle invalid form inputs in a more bootstrap compatible manner (janko) (#83)
|
76
|
+
|
77
|
+
* Use standard vertical Bootstrap forms instead of horizontal forms in templates (janko) (#83)
|
78
|
+
|
79
|
+
* Make templates compatible with Bootstrap 4, and still display correctly with Bootstrap 3 (janko) (#83)
|
80
|
+
|
81
|
+
* Add check_csrf_opts and check_csrf_block for arguments to the check_csrf! call before Rodauth route dispatching (jeremyevans)
|
82
|
+
|
83
|
+
* Add audit_logging feature, logging changes to a database table (jeremyevans)
|
84
|
+
|
85
|
+
* Add hook_action configuration method, called after all before/after hooks (jeremyevans)
|
86
|
+
|
87
|
+
* Enable email rate limiting by default in lockout, reset_password, and verify_account features (jeremyevans)
|
88
|
+
|
89
|
+
* Add session_expiration_error_status method to the session_expiration feature, used for JSON requests where session has expired (jeremyevans)
|
90
|
+
|
91
|
+
* Add domain configuration method to set an explicit domain, instead of relying on the host of the request (jeremyevans)
|
92
|
+
|
93
|
+
* Add inactive_session_error_status to single_session feature, used for JSON requests where session is no longer active (jeremyevans)
|
94
|
+
|
95
|
+
* Prevent use of previous JWT access tokens after refresh when using jwt_refresh and active_sessions features (jeremyevans)
|
96
|
+
|
97
|
+
* Change default setting of jwt_check_accept? from false to true in the jwt feature (jeremyevans)
|
98
|
+
|
99
|
+
* Automatically check CSRF tokens before calling any Rodauth route by default, allow disabling using check_csrf? false (jeremyevans)
|
100
|
+
|
101
|
+
* Add translate(key, default_value) configuration method and have it affect all translatable content (jeremyevans)
|
102
|
+
|
103
|
+
* Add *_page_title configuration methods for all *_view configuration methods (jeremyevans)
|
104
|
+
|
105
|
+
* Default to using Roda's route_csrf plugin for CSRF support, with :csrf=>:rack_csrf available for using rack_csrf (jeremyevans)
|
106
|
+
|
107
|
+
* Allow ability for user to fix an incorrect login when requesting a password reset (janko, jeremyevans) (#76)
|
108
|
+
|
109
|
+
* Add two_factor_auth_return_to_requested_location? to support returning to original page after successful second factor authentication (janko) (#69)
|
110
|
+
|
111
|
+
* Add login_return_to_requested_location? to support returning to original page after successful login (janko) (#69)
|
112
|
+
|
113
|
+
* Add rodauth.require_password_authentication method to confirm_password feature (janko, jeremyevans) (#75)
|
114
|
+
|
115
|
+
* Make remember feature no longer depend on confirm_password (janko) (#79)
|
116
|
+
|
117
|
+
* Replace {create_account,reset_password_request,verify_account_resend}_link configuration methods with *_link_text (janko) (#77)
|
118
|
+
|
119
|
+
* Remove remembered_session_key configuration method, no longer needed (janko) (#80)
|
120
|
+
|
121
|
+
* Add rodauth.possible_authentication_methods for the available authentication methods for the account (jeremyevans)
|
122
|
+
|
123
|
+
* Add active_sessions feature for disabling session reuse after logout, and allowing global logout of all sessions (jeremyevans)
|
124
|
+
|
125
|
+
* Add webauthn_verify_account feature for passwordless WebAuthn setup during account verification (jeremyevans)
|
126
|
+
|
127
|
+
* Allow confirm_password feature to operate as second factor authentication if using webauthn login (jeremyevans)
|
128
|
+
|
129
|
+
* Add webauthn_login feature for passwordless login via WebAuthn (jeremyevans)
|
130
|
+
|
131
|
+
* Do not allow two factor authentication using same type as primary authentication (jeremyevans)
|
132
|
+
|
133
|
+
* Do not require passwords by default if the account does not have a password (jeremyevans)
|
134
|
+
|
135
|
+
* Remove clear_remembered_session_key and two_factor_session_key configuration methods, no longer needed (jeremyevans)
|
136
|
+
|
137
|
+
* Store authentication methods used in the session, available via rodauth.authenticated_by (jeremyevans)
|
138
|
+
|
139
|
+
* Do not require login confirmation by default if verifying accounts or login changes (jeremyevans)
|
140
|
+
|
141
|
+
* Add mark_input_fields_with_inputmode? and inputmode_for_field? configuration methods for controlling inputmode (jeremyevans)
|
142
|
+
|
143
|
+
* Support and enable inputmode=numeric attributes by default for otp auth code and sms code fields (jeremyevans)
|
144
|
+
|
145
|
+
* Add sms_phone_input_type and default to tel instead of using text for SMS phone input (jeremyevans)
|
146
|
+
|
147
|
+
* Add mark_input_fields_with_autocomplete? and autocomplete_for_field? configuration methods for controlling autocomplete (jeremyevans)
|
148
|
+
|
149
|
+
* Support and enable autocomplete attributes by default for fields (jeremyevans)
|
150
|
+
|
151
|
+
* Add login_uses_email? configuration method for whether to treat logins as email addresses (jeremyevans)
|
152
|
+
|
153
|
+
* Remove the verify change login feature, users should switch to the verify login change feature (jeremyevans)
|
154
|
+
|
155
|
+
* Change default setting of json_response_success_key to success in the jwt feature (jeremyevans)
|
156
|
+
|
157
|
+
* Remove deprecated account_model configuration method (jeremyevans)
|
158
|
+
|
159
|
+
* Remove all deprecated configuration and runtime method aliases in the lockout, verify_account, email_auth, reset_password, and verify_login_change features (jeremyevans)
|
160
|
+
|
161
|
+
* Remove deprecated before_otp_authentication_route configuration method (jeremyevans)
|
162
|
+
|
163
|
+
* Change default setting of login_input_type to email if login_column is :email (jeremyevans)
|
164
|
+
|
165
|
+
* Change default setting of mark_input_fields_as_required? to true (jeremyevans)
|
166
|
+
|
167
|
+
* Change default setting of verify_account_set_password? in verify_account feature to true (jeremyevans)
|
168
|
+
|
169
|
+
* Change default setting of json_response_custom_error_status? in jwt feature to true (jeremyevans)
|
170
|
+
|
171
|
+
* Add auto_add_recovery_codes? configuration method to recovery codes feature, and default to false (jeremyevans)
|
172
|
+
|
173
|
+
* Add base_url configuration method to set an explicit base for URLs, instead of relying on the base_url of the request (jeremyevans)
|
174
|
+
|
175
|
+
* Add webauthn feature to handle WebAuthn authentication (jeremyevans)
|
176
|
+
|
177
|
+
* Fix corner cases when disabling a second factor when multiple second factors have been setup (jeremyevans)
|
178
|
+
|
179
|
+
* Don't override second factor used to authenticate when setting up additional second factor authentication (jeremyevans)
|
180
|
+
|
181
|
+
* Add two factor auth, manage, and disable pages (jeremyevans)
|
182
|
+
|
183
|
+
* Drop support for Ruby 1.8 (jeremyevans)
|
184
|
+
|
1
185
|
=== 1.23.0 (2020-03-06)
|
2
186
|
|
3
187
|
* Remove specs from the gem to reduce gem size by over 20% (jeremyevans)
|
data/MIT-LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -1,12 +1,18 @@
|
|
1
1
|
= Rodauth
|
2
2
|
|
3
|
-
Rodauth is
|
4
|
-
rack
|
5
|
-
be used with other web frameworks, database libraries,
|
3
|
+
Rodauth is Ruby's most advanced authentication framework, designed
|
4
|
+
to work in any rack application. It's built using Roda and Sequel,
|
5
|
+
but it can be used with other web frameworks, database libraries,
|
6
|
+
and databases.
|
7
|
+
|
6
8
|
When used with PostgreSQL, MySQL, and Microsoft SQL Server in the
|
7
9
|
default configuration, it offers additional security for password
|
8
10
|
hashes by protecting access via database functions.
|
9
11
|
|
12
|
+
Rodauth supports multiple multifactor authentication methods,
|
13
|
+
multiple passwordless authentication methods, and offers both an
|
14
|
+
HTML and JSON API for all supported features.
|
15
|
+
|
10
16
|
== Design Goals
|
11
17
|
|
12
18
|
* Security: Ship in a maximum security by default configuration
|
@@ -26,19 +32,25 @@ hashes by protecting access via database functions.
|
|
26
32
|
* Confirm Password
|
27
33
|
* Remember (Autologin via token)
|
28
34
|
* Lockout (Bruteforce protection)
|
29
|
-
*
|
30
|
-
*
|
31
|
-
*
|
32
|
-
*
|
35
|
+
* Audit Logging
|
36
|
+
* Email Authentication (Passwordless login via email link)
|
37
|
+
* WebAuthn (Multifactor authentication via WebAuthn)
|
38
|
+
* WebAuthn Login (Passwordless login via WebAuthn)
|
39
|
+
* WebAuthn Verify Account (Passwordless WebAuthn Setup)
|
40
|
+
* OTP (Multifactor authentication via TOTP)
|
41
|
+
* Recovery Codes (Multifactor authentication via backup codes)
|
42
|
+
* SMS Codes (Multifactor authentication via SMS)
|
33
43
|
* Verify Login Change (Verify new login before changing login)
|
34
44
|
* Verify Account Grace Period (Don't require verification before login)
|
35
45
|
* Password Grace Period (Don't require password entry if recently entered)
|
36
46
|
* Password Complexity (More sophisticated checks)
|
47
|
+
* Password Pepper
|
37
48
|
* Disallow Password Reuse
|
38
49
|
* Disallow Common Passwords
|
39
50
|
* Password Expiration
|
40
51
|
* Account Expiration
|
41
52
|
* Session Expiration
|
53
|
+
* Active Sessions (Prevent session reuse after logout, allow logout of all sessions)
|
42
54
|
* Single Session (Only one active session per account)
|
43
55
|
* JWT (JSON API support for all other features)
|
44
56
|
* JWT Refresh (Access & Refresh Token)
|
@@ -58,21 +70,24 @@ IRC :: irc://chat.freenode.net/#rodauth
|
|
58
70
|
|
59
71
|
== Dependencies
|
60
72
|
|
61
|
-
There are some dependencies that Rodauth uses
|
62
|
-
|
63
|
-
gem as it is possible to run without them:
|
73
|
+
There are some dependencies that Rodauth uses depending on the
|
74
|
+
features in use. These are development dependencies instead of
|
75
|
+
runtime dependencies in the gem as it is possible to run without them:
|
64
76
|
|
65
77
|
tilt :: Used by all features unless in JSON API only mode.
|
66
|
-
rack_csrf :: Used
|
67
|
-
|
68
|
-
|
78
|
+
rack_csrf :: Used for CSRF support if the :csrf=>:rack_csrf plugin
|
79
|
+
option is given (the default is to use Roda's route_csrf
|
80
|
+
plugin, as that allows for more secure request-specific
|
81
|
+
tokens).
|
69
82
|
bcrypt :: Used by default for password matching, can be skipped
|
70
83
|
if password_match? is overridden for custom authentication.
|
71
84
|
mail :: Used by default for mailing in the reset password, verify
|
72
|
-
account, verify_login_change, change_password_notify,
|
73
|
-
lockout features.
|
74
|
-
rotp
|
85
|
+
account, verify_login_change, change_password_notify,
|
86
|
+
lockout, and email_auth features.
|
87
|
+
rotp :: Used by the otp feature
|
88
|
+
rqrcode :: Used by the otp feature
|
75
89
|
jwt :: Used by the jwt feature
|
90
|
+
webauthn :: Used by the webauthn feature
|
76
91
|
|
77
92
|
== Security
|
78
93
|
|
@@ -143,10 +158,10 @@ function to reduce the risk of timing attacks.
|
|
143
158
|
|
144
159
|
== HMAC
|
145
160
|
|
146
|
-
By default, Rodauth does not use HMACs,
|
147
|
-
|
148
|
-
an HMAC secret will enable HMACs
|
149
|
-
below.
|
161
|
+
By default, for backwards compatibility, Rodauth does not use HMACs,
|
162
|
+
but you are strongly encouraged to use the +hmac_secret+ configuration
|
163
|
+
method to set an HMAC secret. Setting an HMAC secret will enable HMACs
|
164
|
+
for additional security, as described below.
|
150
165
|
|
151
166
|
=== email_base feature
|
152
167
|
|
@@ -213,6 +228,17 @@ to the OTP setup route. This will return an error with the +otp_secret+ and
|
|
213
228
|
in the POST request to setup OTP, along with a valid OTP auth code for the
|
214
229
|
+otp_secret+.
|
215
230
|
|
231
|
+
=== webauthn feature
|
232
|
+
|
233
|
+
Setting +hmac_secret+ is required to use the webauthn feature, as it is
|
234
|
+
used for checking that the provided authentication challenges have not
|
235
|
+
been modified.
|
236
|
+
|
237
|
+
=== active_sessions feature
|
238
|
+
|
239
|
+
Setting +hmac_secret+ is required to use the active_sessions feature,
|
240
|
+
as the database stores an HMAC of the active session ID.
|
241
|
+
|
216
242
|
=== single_session feature
|
217
243
|
|
218
244
|
Setting +hmac_secret+ will ensure the single session secret set in the
|
@@ -406,6 +432,25 @@ Note that these migrations require Sequel 4.35.0+.
|
|
406
432
|
end
|
407
433
|
end
|
408
434
|
|
435
|
+
# Used by the audit logging feature
|
436
|
+
json_type = case database_type
|
437
|
+
when :postgres
|
438
|
+
:jsonb
|
439
|
+
when :sqlite, :mysql
|
440
|
+
:json
|
441
|
+
else
|
442
|
+
String
|
443
|
+
end
|
444
|
+
create_table(:account_authentication_audit_logs) do
|
445
|
+
primary_key :id, :type=>:Bignum
|
446
|
+
foreign_key :account_id, :accounts, :null=>false, :type=>:Bignum
|
447
|
+
DateTime :at, :null=>false, :default=>Sequel::CURRENT_TIMESTAMP
|
448
|
+
String :message, :null=>false
|
449
|
+
column :metadata, json_type
|
450
|
+
index [:account_id, :at], :name=>:audit_account_at_idx
|
451
|
+
index :at, :name=>:audit_at_idx
|
452
|
+
end
|
453
|
+
|
409
454
|
# Used by the password reset feature
|
410
455
|
create_table(:account_password_reset_keys) do
|
411
456
|
foreign_key :id, :accounts, :primary_key=>true, :type=>:Bignum
|
@@ -417,9 +462,10 @@ Note that these migrations require Sequel 4.35.0+.
|
|
417
462
|
# Used by the jwt refresh feature
|
418
463
|
create_table(:account_jwt_refresh_keys) do
|
419
464
|
primary_key :id, :type=>:Bignum
|
420
|
-
foreign_key :account_id, :accounts, :type=>:Bignum
|
465
|
+
foreign_key :account_id, :accounts, :null=>false, :type=>:Bignum
|
421
466
|
String :key, :null=>false
|
422
467
|
DateTime :deadline, deadline_opts[1]
|
468
|
+
index :account_id, :name=>:account_jwt_rk_account_id_idx
|
423
469
|
end
|
424
470
|
|
425
471
|
# Used by the account verification feature
|
@@ -485,6 +531,29 @@ Note that these migrations require Sequel 4.35.0+.
|
|
485
531
|
String :key, :null=>false
|
486
532
|
end
|
487
533
|
|
534
|
+
# Used by the active sessions feature
|
535
|
+
create_table(:account_active_session_keys) do
|
536
|
+
foreign_key :account_id, :accounts, :type=>:Bignum
|
537
|
+
String :session_id
|
538
|
+
Time :created_at, :null=>false, :default=>Sequel::CURRENT_TIMESTAMP
|
539
|
+
Time :last_use, :null=>false, :default=>Sequel::CURRENT_TIMESTAMP
|
540
|
+
primary_key [:account_id, :session_id]
|
541
|
+
end
|
542
|
+
|
543
|
+
# Used by the webauthn feature
|
544
|
+
create_table(:account_webauthn_user_ids) do
|
545
|
+
foreign_key :id, :accounts, :primary_key=>true, :type=>:Bignum
|
546
|
+
String :webauthn_id, :null=>false
|
547
|
+
end
|
548
|
+
create_table(:account_webauthn_keys) do
|
549
|
+
foreign_key :account_id, :accounts, :type=>:Bignum
|
550
|
+
String :webauthn_id
|
551
|
+
String :public_key, :null=>false
|
552
|
+
Integer :sign_count, :null=>false
|
553
|
+
Time :last_use, :null=>false, :default=>Sequel::CURRENT_TIMESTAMP
|
554
|
+
primary_key [:account_id, :webauthn_id]
|
555
|
+
end
|
556
|
+
|
488
557
|
# Used by the otp feature
|
489
558
|
create_table(:account_otp_keys) do
|
490
559
|
foreign_key :id, :accounts, :primary_key=>true, :type=>:Bignum
|
@@ -519,22 +588,26 @@ Note that these migrations require Sequel 4.35.0+.
|
|
519
588
|
else
|
520
589
|
get(Sequel.function(:DB_NAME))
|
521
590
|
end
|
522
|
-
run "GRANT
|
523
|
-
run "GRANT
|
524
|
-
run "GRANT
|
525
|
-
run "GRANT
|
526
|
-
run "GRANT
|
527
|
-
run "GRANT
|
528
|
-
run "GRANT
|
529
|
-
run "GRANT
|
530
|
-
run "GRANT
|
531
|
-
run "GRANT
|
532
|
-
run "GRANT
|
533
|
-
run "GRANT
|
534
|
-
run "GRANT
|
535
|
-
run "GRANT
|
536
|
-
run "GRANT
|
537
|
-
run "GRANT
|
591
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_statuses TO #{user}"
|
592
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON accounts TO #{user}"
|
593
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_authentication_audit_logs TO #{user}"
|
594
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_password_reset_keys TO #{user}"
|
595
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_jwt_refresh_keys TO #{user}"
|
596
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_verification_keys TO #{user}"
|
597
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_login_change_keys TO #{user}"
|
598
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_remember_keys TO #{user}"
|
599
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_login_failures TO #{user}"
|
600
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_email_auth_keys TO #{user}"
|
601
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_lockouts TO #{user}"
|
602
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_password_change_times TO #{user}"
|
603
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_activity_times TO #{user}"
|
604
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_session_keys TO #{user}"
|
605
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_active_session_keys TO #{user}"
|
606
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_webauthn_user_ids TO #{user}"
|
607
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_webauthn_keys TO #{user}"
|
608
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_otp_keys TO #{user}"
|
609
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_recovery_codes TO #{user}"
|
610
|
+
run "GRANT SELECT, INSERT, UPDATE, DELETE ON account_sms_codes TO #{user}"
|
538
611
|
end
|
539
612
|
end
|
540
613
|
|
@@ -542,7 +615,10 @@ Note that these migrations require Sequel 4.35.0+.
|
|
542
615
|
drop_table(:account_sms_codes,
|
543
616
|
:account_recovery_codes,
|
544
617
|
:account_otp_keys,
|
618
|
+
:account_webauthn_keys,
|
619
|
+
:account_webauthn_user_ids,
|
545
620
|
:account_session_keys,
|
621
|
+
:account_active_session_keys,
|
546
622
|
:account_activity_times,
|
547
623
|
:account_password_change_times,
|
548
624
|
:account_email_auth_keys,
|
@@ -553,6 +629,7 @@ Note that these migrations require Sequel 4.35.0+.
|
|
553
629
|
:account_verification_keys,
|
554
630
|
:account_jwt_refresh_keys,
|
555
631
|
:account_password_reset_keys,
|
632
|
+
:account_authentication_audit_logs,
|
556
633
|
:accounts,
|
557
634
|
:account_statuses)
|
558
635
|
end
|
@@ -644,7 +721,8 @@ for the password user using Sequel's migration API:
|
|
644
721
|
|
645
722
|
If the database is not PostgreSQL, MySQL, or Microsoft SQL Server, or you
|
646
723
|
cannot use multiple user accounts, just combine the two migrations into a
|
647
|
-
single migration
|
724
|
+
single migration, removing all the code related to database permissions
|
725
|
+
and database functions.
|
648
726
|
|
649
727
|
One thing to notice in the above migrations is that Rodauth uses additional
|
650
728
|
tables for additional features, instead of additional columns in a single
|
@@ -761,10 +839,8 @@ should be flexible enough to integrate into most legacy systems.
|
|
761
839
|
When loading the rodauth plugin, you can also pass an options hash,
|
762
840
|
which configures which dependent plugins should be loaded. Options:
|
763
841
|
|
764
|
-
:csrf :: Set to +false+ to not load a csrf plugin. Set to +:
|
765
|
-
to use the
|
766
|
-
recommended to set the +:route_csrf+ option as that allows
|
767
|
-
for more secure request-specific CSRF tokens.
|
842
|
+
:csrf :: Set to +false+ to not load a csrf plugin. Set to +:rack_csrf+
|
843
|
+
to use the csrf plugin instead of the route_csrf plugin.
|
768
844
|
:flash :: Set to +false+ to not load the flash plugin
|
769
845
|
:json :: Set to +true+ to load the json and json_parser plugins. Set
|
770
846
|
to +:only+ to only load those plugins and not any other plugins.
|
@@ -783,42 +859,47 @@ view the appropriate file in the doc directory.
|
|
783
859
|
* {Login Password Requirements Base}[rdoc-ref:doc/login_password_requirements_base.rdoc] (this feature is autoloaded by features that set logins/passwords)
|
784
860
|
* {Email Base}[rdoc-ref:doc/email_base.rdoc] (this feature is autoloaded by features that send email)
|
785
861
|
* {Two Factor Base}[rdoc-ref:doc/two_factor_base.rdoc] (this feature is autoloaded by 2 factor authentication features)
|
786
|
-
* {
|
787
|
-
* {
|
862
|
+
* {Account Expiration}[rdoc-ref:doc/account_expiration.rdoc]
|
863
|
+
* {Active Sessions}[rdoc-ref:doc/active_sessions.rdoc]
|
864
|
+
* {Audit Logging}[rdoc-ref:doc/audit_logging.rdoc]
|
865
|
+
* {Change Login}[rdoc-ref:doc/change_login.rdoc]
|
788
866
|
* {Change Password}[rdoc-ref:doc/change_password.rdoc]
|
789
867
|
* {Change Password Notify}[rdoc-ref:doc/change_password_notify.rdoc]
|
790
|
-
* {Change Login}[rdoc-ref:doc/change_login.rdoc]
|
791
|
-
* {Reset Password}[rdoc-ref:doc/reset_password.rdoc]
|
792
|
-
* {Create Account}[rdoc-ref:doc/create_account.rdoc]
|
793
868
|
* {Close Account}[rdoc-ref:doc/close_account.rdoc]
|
794
|
-
* {Verify Account}[rdoc-ref:doc/verify_account.rdoc]
|
795
869
|
* {Confirm Password}[rdoc-ref:doc/confirm_password.rdoc]
|
796
|
-
* {
|
797
|
-
* {
|
870
|
+
* {Create Account}[rdoc-ref:doc/create_account.rdoc]
|
871
|
+
* {Disallow Common Passwords}[rdoc-ref:doc/disallow_common_passwords.rdoc]
|
872
|
+
* {Disallow Password Reuse}[rdoc-ref:doc/disallow_password_reuse.rdoc]
|
798
873
|
* {Email Authentication}[rdoc-ref:doc/email_auth.rdoc]
|
874
|
+
* {HTTP Basic Auth}[rdoc-ref:doc/http_basic_auth.rdoc]
|
875
|
+
* {JWT CORS}[rdoc-ref:doc/jwt_cors.rdoc]
|
876
|
+
* {JWT Refresh}[rdoc-ref:doc/jwt_refresh.rdoc]
|
877
|
+
* {JWT}[rdoc-ref:doc/jwt.rdoc]
|
878
|
+
* {Lockout}[rdoc-ref:doc/lockout.rdoc]
|
879
|
+
* {Login}[rdoc-ref:doc/login.rdoc]
|
880
|
+
* {Logout}[rdoc-ref:doc/logout.rdoc]
|
799
881
|
* {OTP}[rdoc-ref:doc/otp.rdoc]
|
800
|
-
* {Recovery Codes}[rdoc-ref:doc/recovery_codes.rdoc]
|
801
|
-
* {SMS Codes}[rdoc-ref:doc/sms_codes.rdoc]
|
802
|
-
* {Verify Login Change}[rdoc-ref:doc/verify_login_change.rdoc]
|
803
|
-
* {Verify Change Login}[rdoc-ref:doc/verify_change_login.rdoc]
|
804
|
-
* {Verify Account Grace Period}[rdoc-ref:doc/verify_account_grace_period.rdoc]
|
805
|
-
* {Password Grace Period}[rdoc-ref:doc/password_grace_period.rdoc]
|
806
882
|
* {Password Complexity}[rdoc-ref:doc/password_complexity.rdoc]
|
807
|
-
* {Disallow Password Reuse}[rdoc-ref:doc/disallow_password_reuse.rdoc]
|
808
|
-
* {Disallow Common Passwords}[rdoc-ref:doc/disallow_common_passwords.rdoc]
|
809
|
-
* {Update Password Hash}[rdoc-ref:doc/update_password_hash.rdoc]
|
810
883
|
* {Password Expiration}[rdoc-ref:doc/password_expiration.rdoc]
|
811
|
-
* {
|
884
|
+
* {Password Grace Period}[rdoc-ref:doc/password_grace_period.rdoc]
|
885
|
+
* {Password Pepper}[rdoc-ref:doc/password_pepper.rdoc]
|
886
|
+
* {Recovery Codes}[rdoc-ref:doc/recovery_codes.rdoc]
|
887
|
+
* {Remember}[rdoc-ref:doc/remember.rdoc]
|
888
|
+
* {Reset Password}[rdoc-ref:doc/reset_password.rdoc]
|
812
889
|
* {Session Expiration}[rdoc-ref:doc/session_expiration.rdoc]
|
813
890
|
* {Single Session}[rdoc-ref:doc/single_session.rdoc]
|
814
|
-
* {
|
815
|
-
* {
|
816
|
-
* {
|
817
|
-
* {
|
891
|
+
* {SMS Codes}[rdoc-ref:doc/sms_codes.rdoc]
|
892
|
+
* {Update Password Hash}[rdoc-ref:doc/update_password_hash.rdoc]
|
893
|
+
* {Verify Account}[rdoc-ref:doc/verify_account.rdoc]
|
894
|
+
* {Verify Account Grace Period}[rdoc-ref:doc/verify_account_grace_period.rdoc]
|
895
|
+
* {Verify Login Change}[rdoc-ref:doc/verify_login_change.rdoc]
|
896
|
+
* {WebAuthn}[rdoc-ref:doc/webauthn.rdoc]
|
897
|
+
* {WebAuthn Login}[rdoc-ref:doc/webauthn_login.rdoc]
|
898
|
+
* {WebAuthn Verify Account}[rdoc-ref:doc/webauthn_verify_account.rdoc]
|
818
899
|
|
819
900
|
=== Calling Rodauth in the Routing Tree
|
820
901
|
|
821
|
-
In general, you will usually want to call rodauth early in your
|
902
|
+
In general, you will usually want to call +r.rodauth+ early in your
|
822
903
|
route block:
|
823
904
|
|
824
905
|
route do |r|
|
@@ -897,6 +978,12 @@ logged_in? :: Whether the session has been logged in.
|
|
897
978
|
authenticated? :: Similar to +logged_in?+, but if the account has setup two
|
898
979
|
factor authentication, whether the session has authenticated
|
899
980
|
via two factors.
|
981
|
+
authenticated_by :: An array of strings for successful authentication methods for
|
982
|
+
the current session (e.g. password/remember/webauthn).
|
983
|
+
possible_authentication_methods :: An array of strings for possible authentication
|
984
|
+
types that can be used for the account.
|
985
|
+
autologin_type :: If the current session was authenticated via autologin, the
|
986
|
+
type of autologin used.
|
900
987
|
require_two_factor_setup :: (two_factor_base feature) Require the session to have
|
901
988
|
setup two factor authentication, redirecting the
|
902
989
|
request to the two factor authentication setup page
|
@@ -911,6 +998,14 @@ require_current_password :: (password_expiration feature) Require a current
|
|
911
998
|
password, redirecting the request to the change
|
912
999
|
password page if the password for the account has
|
913
1000
|
expired.
|
1001
|
+
require_password_authentication :: (confirm_password feature) If not authenticated
|
1002
|
+
via password and the account has a password,
|
1003
|
+
redirect to the password confirmation page,
|
1004
|
+
saving the current location to redirect back
|
1005
|
+
to after password has been successfully
|
1006
|
+
confirmed. If the password_grace_period feature
|
1007
|
+
is used, also redirect if the password has not
|
1008
|
+
been recently entered.
|
914
1009
|
load_memory :: (remember feature) If the session has not been authenticated, look
|
915
1010
|
for the remember cookie. If present and valid, automatically
|
916
1011
|
log the session in, but mark that it was logged in via a remember
|
@@ -920,9 +1015,15 @@ logged_in_via_remember_key? :: (remember feature) Whether the current session ha
|
|
920
1015
|
sensitive actions where you want to require the user
|
921
1016
|
to reenter the password, you can use the
|
922
1017
|
confirm_password feature.
|
1018
|
+
http_basic_auth :: (http_basic_auth feature) Use HTTP Basic Authentication information
|
1019
|
+
to login the user if provided.
|
1020
|
+
require_http_basic_auth :: (http_basic_auth feature) Require that HTTP Basic
|
1021
|
+
Authentication be provided in the request.
|
923
1022
|
check_session_expiration :: (session_expiration feature) Check whether the current
|
924
1023
|
session has expired, automatically logging the session
|
925
1024
|
out if so.
|
1025
|
+
check_active_session :: (active_sessions feature) Check whether the current session
|
1026
|
+
is still active, automatically logging the session out if not.
|
926
1027
|
check_single_session :: (single_session feature) Check whether the current
|
927
1028
|
session is still the only valid session, automatically logging
|
928
1029
|
the session out if not.
|
@@ -931,10 +1032,15 @@ verified_account? :: (verify_grace_period feature) Whether the account is curren
|
|
931
1032
|
login as they are in the grace period.
|
932
1033
|
locked_out? :: (lockout feature) Whether the account for the current session has been
|
933
1034
|
locked out.
|
1035
|
+
authenticated_webauthn_id :: (webauthn feature) If the current session was
|
1036
|
+
authenticated via webauthn, the webauthn id of the
|
1037
|
+
credential used.
|
934
1038
|
*_path :: One of these is added for each of the routes added by Rodauth, giving the
|
935
|
-
relative path to the route.
|
1039
|
+
relative path to the route. Any options passed to this method will be
|
1040
|
+
converted into query parameters.
|
936
1041
|
*_url :: One of these is added for each of the routes added by Rodauth, giving the
|
937
|
-
|
1042
|
+
URL to the route. Any options passed to this method will be converted
|
1043
|
+
into query parameters.
|
938
1044
|
|
939
1045
|
=== With Multiple Configurations
|
940
1046
|
|
@@ -958,6 +1064,18 @@ the name as an argument to use that configuration:
|
|
958
1064
|
r.rodauth
|
959
1065
|
end
|
960
1066
|
|
1067
|
+
By default, alternate configurations will use the same session keys as the
|
1068
|
+
primary configuration, which may be undesirable. To ensure session state is
|
1069
|
+
separated between configurations, you can set a session key prefix for
|
1070
|
+
alternate configurations. If you are using the remember feature in both
|
1071
|
+
configurations, you may also want to set a different remember key in the
|
1072
|
+
alternate configuration:
|
1073
|
+
|
1074
|
+
plugin :rodauth, :name=>:secondary do
|
1075
|
+
session_key_prefix "secondary_"
|
1076
|
+
remember_cookie_key "_secondary_remember"
|
1077
|
+
end
|
1078
|
+
|
961
1079
|
=== With Password Hashes Inside the Accounts Table
|
962
1080
|
|
963
1081
|
You can use Rodauth if you are storing password hashes in the same
|
@@ -1066,6 +1184,20 @@ Facebook OAuth access token.
|
|
1066
1184
|
end
|
1067
1185
|
end
|
1068
1186
|
|
1187
|
+
=== With Rails
|
1188
|
+
|
1189
|
+
If you're using Rails, you can use the
|
1190
|
+
{rodauth-rails}[https://github.com/janko/rodauth-rails] gem which provides
|
1191
|
+
Rails integration for Rodauth. Some of its features include:
|
1192
|
+
|
1193
|
+
* generators for Rodauth & Sequel configuration, as well as views and mailers
|
1194
|
+
* uses Rails' flash messages and CSRF protection
|
1195
|
+
* automatically sets HMAC secret to Rails' secret key base
|
1196
|
+
* uses Action Controller & Action View for rendering templates
|
1197
|
+
* uses Action Mailer for sending emails
|
1198
|
+
|
1199
|
+
Follow the instructions in the rodauth-rails README to get started.
|
1200
|
+
|
1069
1201
|
=== With Other Web Frameworks
|
1070
1202
|
|
1071
1203
|
You can use Rodauth even if your application does not use the Roda web
|
@@ -1110,17 +1242,20 @@ don't use Roda:
|
|
1110
1242
|
|
1111
1243
|
=== Using 2 Factor Authentication
|
1112
1244
|
|
1113
|
-
Rodauth ships with 2 factor authentication support via
|
1114
|
-
|
1115
|
-
|
1116
|
-
|
1245
|
+
Rodauth ships with 2 factor authentication support via the following
|
1246
|
+
methods:
|
1247
|
+
|
1248
|
+
* WebAuthn
|
1249
|
+
* TOTP (Time-Based One-Time Passwords, RFC 6238).
|
1250
|
+
* SMS Codes
|
1251
|
+
* Recovery Codes
|
1117
1252
|
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1253
|
+
There are multiple ways to integrate 2 factor authentication with
|
1254
|
+
Rodauth, based on the needs of the application. By default, SMS
|
1255
|
+
codes and recovery codes are treated only as backup 2nd factors,
|
1256
|
+
a user cannot enable them without first enabling another 2nd factor
|
1257
|
+
authentication method. However, you can change this by using
|
1258
|
+
a configuration method.
|
1124
1259
|
|
1125
1260
|
If you want to support but not require 2 factor authentication:
|
1126
1261
|
|
@@ -1134,7 +1269,7 @@ If you want to support but not require 2 factor authentication:
|
|
1134
1269
|
# ...
|
1135
1270
|
end
|
1136
1271
|
|
1137
|
-
If you want to force all users to use
|
1272
|
+
If you want to force all users to use 2 factor authentication, requiring users
|
1138
1273
|
that don't currently have two authentication to set it up:
|
1139
1274
|
|
1140
1275
|
route do |r|
|
@@ -1251,7 +1386,7 @@ use the following basic structure
|
|
1251
1386
|
end
|
1252
1387
|
end
|
1253
1388
|
|
1254
|
-
See the
|
1389
|
+
See the {internals guide}[rdoc-ref:doc/internals.rdoc] for a more complete
|
1255
1390
|
example of how to construct features.
|
1256
1391
|
|
1257
1392
|
=== Overriding Route-Level Behavior
|
@@ -1281,6 +1416,13 @@ benefit from precompiling your rodauth templates:
|
|
1281
1416
|
end
|
1282
1417
|
precompile_rodauth_templates
|
1283
1418
|
|
1419
|
+
== Ruby Support Policy
|
1420
|
+
|
1421
|
+
Rodauth fully supports the currently supported versions of Ruby (MRI) and JRuby. It may
|
1422
|
+
support unsupported versions of Ruby or JRuby, but such support may be dropped in any
|
1423
|
+
minor version if keeping it becomes a support issue. The minimum Ruby version
|
1424
|
+
required to run the current version of Rodauth is 1.9.2.
|
1425
|
+
|
1284
1426
|
== Similar Projects
|
1285
1427
|
|
1286
1428
|
All of these are Rails-specific:
|