rodauth 1.23.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +184 -0
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +221 -79
  5. data/doc/account_expiration.rdoc +12 -26
  6. data/doc/active_sessions.rdoc +49 -0
  7. data/doc/audit_logging.rdoc +44 -0
  8. data/doc/base.rdoc +76 -128
  9. data/doc/change_login.rdoc +7 -14
  10. data/doc/change_password.rdoc +9 -13
  11. data/doc/change_password_notify.rdoc +2 -2
  12. data/doc/close_account.rdoc +9 -16
  13. data/doc/confirm_password.rdoc +12 -5
  14. data/doc/create_account.rdoc +11 -22
  15. data/doc/disallow_password_reuse.rdoc +6 -13
  16. data/doc/email_auth.rdoc +15 -14
  17. data/doc/email_base.rdoc +5 -15
  18. data/doc/guides/admin_activation.rdoc +46 -0
  19. data/doc/guides/already_authenticated.rdoc +10 -0
  20. data/doc/guides/alternative_login.rdoc +46 -0
  21. data/doc/guides/create_account_programmatically.rdoc +38 -0
  22. data/doc/guides/delay_password.rdoc +25 -0
  23. data/doc/guides/email_only.rdoc +16 -0
  24. data/doc/guides/i18n.rdoc +26 -0
  25. data/doc/{internals.rdoc → guides/internals.rdoc} +0 -0
  26. data/doc/guides/links.rdoc +12 -0
  27. data/doc/guides/login_return.rdoc +37 -0
  28. data/doc/guides/password_column.rdoc +25 -0
  29. data/doc/guides/password_confirmation.rdoc +37 -0
  30. data/doc/guides/password_requirements.rdoc +30 -0
  31. data/doc/guides/paths.rdoc +36 -0
  32. data/doc/guides/query_params.rdoc +9 -0
  33. data/doc/guides/redirects.rdoc +17 -0
  34. data/doc/guides/registration_field.rdoc +68 -0
  35. data/doc/guides/require_mfa.rdoc +30 -0
  36. data/doc/guides/reset_password_autologin.rdoc +21 -0
  37. data/doc/guides/status_column.rdoc +28 -0
  38. data/doc/guides/totp_or_recovery.rdoc +16 -0
  39. data/doc/http_basic_auth.rdoc +10 -1
  40. data/doc/jwt.rdoc +22 -22
  41. data/doc/jwt_cors.rdoc +2 -3
  42. data/doc/jwt_refresh.rdoc +23 -8
  43. data/doc/lockout.rdoc +17 -15
  44. data/doc/login.rdoc +17 -2
  45. data/doc/login_password_requirements_base.rdoc +18 -37
  46. data/doc/logout.rdoc +2 -2
  47. data/doc/otp.rdoc +25 -19
  48. data/doc/password_complexity.rdoc +10 -26
  49. data/doc/password_expiration.rdoc +11 -25
  50. data/doc/password_grace_period.rdoc +16 -2
  51. data/doc/password_pepper.rdoc +44 -0
  52. data/doc/recovery_codes.rdoc +18 -12
  53. data/doc/release_notes/2.0.0.txt +361 -0
  54. data/doc/release_notes/2.1.0.txt +31 -0
  55. data/doc/release_notes/2.2.0.txt +39 -0
  56. data/doc/release_notes/2.3.0.txt +37 -0
  57. data/doc/release_notes/2.4.0.txt +22 -0
  58. data/doc/remember.rdoc +40 -64
  59. data/doc/reset_password.rdoc +12 -9
  60. data/doc/session_expiration.rdoc +1 -0
  61. data/doc/single_session.rdoc +16 -25
  62. data/doc/sms_codes.rdoc +24 -14
  63. data/doc/two_factor_base.rdoc +60 -22
  64. data/doc/verify_account.rdoc +14 -12
  65. data/doc/verify_account_grace_period.rdoc +6 -2
  66. data/doc/verify_login_change.rdoc +9 -8
  67. data/doc/webauthn.rdoc +115 -0
  68. data/doc/webauthn_login.rdoc +15 -0
  69. data/doc/webauthn_verify_account.rdoc +9 -0
  70. data/javascript/webauthn_auth.js +45 -0
  71. data/javascript/webauthn_setup.js +35 -0
  72. data/lib/roda/plugins/rodauth.rb +1 -1
  73. data/lib/rodauth.rb +33 -28
  74. data/lib/rodauth/features/account_expiration.rb +5 -5
  75. data/lib/rodauth/features/active_sessions.rb +158 -0
  76. data/lib/rodauth/features/audit_logging.rb +98 -0
  77. data/lib/rodauth/features/base.rb +152 -49
  78. data/lib/rodauth/features/change_password_notify.rb +1 -1
  79. data/lib/rodauth/features/close_account.rb +8 -6
  80. data/lib/rodauth/features/confirm_password.rb +40 -2
  81. data/lib/rodauth/features/create_account.rb +8 -13
  82. data/lib/rodauth/features/disallow_common_passwords.rb +1 -1
  83. data/lib/rodauth/features/disallow_password_reuse.rb +5 -3
  84. data/lib/rodauth/features/email_auth.rb +30 -28
  85. data/lib/rodauth/features/email_base.rb +3 -3
  86. data/lib/rodauth/features/http_basic_auth.rb +55 -35
  87. data/lib/rodauth/features/jwt.rb +63 -16
  88. data/lib/rodauth/features/jwt_cors.rb +15 -15
  89. data/lib/rodauth/features/jwt_refresh.rb +42 -13
  90. data/lib/rodauth/features/lockout.rb +11 -13
  91. data/lib/rodauth/features/login.rb +58 -13
  92. data/lib/rodauth/features/login_password_requirements_base.rb +13 -8
  93. data/lib/rodauth/features/otp.rb +76 -82
  94. data/lib/rodauth/features/password_complexity.rb +8 -13
  95. data/lib/rodauth/features/password_expiration.rb +1 -1
  96. data/lib/rodauth/features/password_grace_period.rb +17 -10
  97. data/lib/rodauth/features/password_pepper.rb +45 -0
  98. data/lib/rodauth/features/recovery_codes.rb +47 -51
  99. data/lib/rodauth/features/remember.rb +13 -27
  100. data/lib/rodauth/features/reset_password.rb +25 -25
  101. data/lib/rodauth/features/session_expiration.rb +7 -10
  102. data/lib/rodauth/features/single_session.rb +8 -6
  103. data/lib/rodauth/features/sms_codes.rb +58 -68
  104. data/lib/rodauth/features/two_factor_base.rb +134 -30
  105. data/lib/rodauth/features/verify_account.rb +28 -20
  106. data/lib/rodauth/features/verify_account_grace_period.rb +18 -9
  107. data/lib/rodauth/features/verify_login_change.rb +11 -10
  108. data/lib/rodauth/features/webauthn.rb +505 -0
  109. data/lib/rodauth/features/webauthn_login.rb +70 -0
  110. data/lib/rodauth/features/webauthn_verify_account.rb +46 -0
  111. data/lib/rodauth/migrations.rb +16 -5
  112. data/lib/rodauth/version.rb +2 -2
  113. data/templates/button.str +1 -3
  114. data/templates/change-login.str +1 -2
  115. data/templates/change-password.str +3 -5
  116. data/templates/close-account.str +2 -2
  117. data/templates/confirm-password.str +1 -1
  118. data/templates/create-account.str +1 -1
  119. data/templates/email-auth-request-form.str +1 -2
  120. data/templates/email-auth.str +1 -1
  121. data/templates/global-logout-field.str +6 -0
  122. data/templates/login-confirm-field.str +2 -4
  123. data/templates/login-display.str +3 -2
  124. data/templates/login-field.str +2 -4
  125. data/templates/login-form-footer.str +6 -0
  126. data/templates/login-form.str +7 -0
  127. data/templates/login.str +1 -9
  128. data/templates/logout.str +1 -1
  129. data/templates/multi-phase-login.str +3 -0
  130. data/templates/otp-auth-code-field.str +5 -3
  131. data/templates/otp-auth.str +1 -1
  132. data/templates/otp-disable.str +1 -1
  133. data/templates/otp-setup.str +3 -3
  134. data/templates/password-confirm-field.str +2 -4
  135. data/templates/password-field.str +2 -4
  136. data/templates/recovery-auth.str +3 -6
  137. data/templates/recovery-codes.str +1 -1
  138. data/templates/remember.str +15 -20
  139. data/templates/reset-password-request.str +2 -2
  140. data/templates/reset-password.str +1 -2
  141. data/templates/sms-auth.str +1 -1
  142. data/templates/sms-code-field.str +5 -3
  143. data/templates/sms-confirm.str +1 -2
  144. data/templates/sms-disable.str +1 -2
  145. data/templates/sms-request.str +1 -1
  146. data/templates/sms-setup.str +6 -4
  147. data/templates/two-factor-auth.str +5 -0
  148. data/templates/two-factor-disable.str +6 -0
  149. data/templates/two-factor-manage.str +16 -0
  150. data/templates/unlock-account-request.str +2 -2
  151. data/templates/unlock-account.str +1 -1
  152. data/templates/verify-account-resend.str +1 -1
  153. data/templates/verify-account.str +1 -2
  154. data/templates/verify-login-change.str +1 -1
  155. data/templates/webauthn-auth.str +11 -0
  156. data/templates/webauthn-remove.str +14 -0
  157. data/templates/webauthn-setup.str +12 -0
  158. metadata +96 -13
  159. data/doc/verify_change_login.rdoc +0 -11
  160. data/lib/rodauth/features/verify_change_login.rb +0 -20
@@ -1,7 +1,7 @@
1
- <form action="#{rodauth.reset_password_request_path}" method="post" class="rodauth form-horizontal" role="form" id="reset-password-request-form">
1
+ <form action="#{rodauth.reset_password_request_path}" method="post" class="rodauth" role="form" id="reset-password-request-form">
2
2
  #{rodauth.reset_password_request_additional_form_tags}
3
3
  #{rodauth.csrf_tag(rodauth.reset_password_request_path)}
4
4
  #{rodauth.reset_password_explanatory_text}
5
- #{rodauth.param_or_nil(rodauth.login_param) ? rodauth.login_hidden_field : rodauth.render('login-field')}
5
+ #{rodauth.param_or_nil(rodauth.login_param) && !rodauth.field_error(rodauth.login_param) ? rodauth.login_hidden_field : rodauth.render('login-field')}
6
6
  #{rodauth.button(rodauth.reset_password_request_button)}
7
7
  </form>
@@ -1,8 +1,7 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="reset-password-form">
1
+ <form method="post" class="rodauth" role="form" id="reset-password-form">
2
2
  #{rodauth.reset_password_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('password-field')}
5
5
  #{rodauth.render('password-confirm-field') if rodauth.require_password_confirmation?}
6
6
  #{rodauth.button(rodauth.reset_password_button)}
7
7
  </form>
8
-
@@ -1,4 +1,4 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="sms-auth-form">
1
+ <form method="post" class="rodauth" role="form" id="sms-auth-form">
2
2
  #{rodauth.sms_auth_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('sms-code-field')}
@@ -1,6 +1,8 @@
1
1
  <div class="form-group">
2
- <label class="col-sm-3 control-label" for="sms-code">#{rodauth.sms_code_label}#{rodauth.input_field_label_suffix}</label>
3
- <div class="col-sm-3">
4
- #{rodauth.input_field_string(rodauth.sms_code_param, 'sms-code', :value => '')}
2
+ <label for="sms-code">#{rodauth.sms_code_label}#{rodauth.input_field_label_suffix}</label>
3
+ <div class="row">
4
+ <div class="col-sm-3">
5
+ #{rodauth.input_field_string(rodauth.sms_code_param, 'sms-code', :value => '', :autocomplete=>'one-time-code', :inputmode=>'numeric')}
6
+ </div>
5
7
  </div>
6
8
  </div>
@@ -1,7 +1,6 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="sms-confirm-form">
1
+ <form method="post" class="rodauth" role="form" id="sms-confirm-form">
2
2
  #{rodauth.sms_confirm_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('sms-code-field')}
5
5
  #{rodauth.button(rodauth.sms_confirm_button)}
6
6
  </form>
7
-
@@ -1,7 +1,6 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="sms-disable-form">
1
+ <form method="post" class="rodauth" role="form" id="sms-disable-form">
2
2
  #{rodauth.sms_disable_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('password-field') if rodauth.two_factor_modifications_require_password?}
5
5
  #{rodauth.button(rodauth.sms_disable_button)}
6
6
  </form>
7
-
@@ -1,4 +1,4 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="sms-request-form">
1
+ <form method="post" class="rodauth" role="form" id="sms-request-form">
2
2
  #{rodauth.sms_request_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.button(rodauth.sms_request_button)}
@@ -1,11 +1,13 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="sms-setup-form">
1
+ <form method="post" class="rodauth" role="form" id="sms-setup-form">
2
2
  #{rodauth.sms_setup_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('password-field') if rodauth.two_factor_modifications_require_password?}
5
5
  <div class="form-group">
6
- <label class="col-sm-2 control-label" for="sms-phone">#{rodauth.sms_phone_label}#{rodauth.input_field_label_suffix}</label>
7
- <div class="col-sm-3">
8
- #{rodauth.input_field_string(rodauth.sms_phone_param, 'sms-phone')}
6
+ <label for="sms-phone">#{rodauth.sms_phone_label}#{rodauth.input_field_label_suffix}</label>
7
+ <div class="row">
8
+ <div class="col-sm-3">
9
+ #{rodauth.input_field_string(rodauth.sms_phone_param, 'sms-phone', :type=>rodauth.sms_phone_input_type, :autocomplete=>'tel')}
10
+ </div>
9
11
  </div>
10
12
  </div>
11
13
  #{rodauth.button(rodauth.sms_setup_button)}
@@ -0,0 +1,5 @@
1
+ <ul class="rodauth-links rodauth-two-factor-auth-links">
2
+ #{rodauth.two_factor_auth_links.sort.map do |_, link, text|
3
+ "<li><a href=\"#{h link}\">#{h text}</a></li>"
4
+ end.join}
5
+ </ul>
@@ -0,0 +1,6 @@
1
+ <form method="post" class="rodauth" role="form" id="multifactor-disable-form">
2
+ #{rodauth.two_factor_disable_additional_form_tags}
3
+ #{rodauth.csrf_tag}
4
+ #{rodauth.render('password-field') if rodauth.two_factor_modifications_require_password?}
5
+ #{rodauth.button(rodauth.two_factor_disable_button)}
6
+ </form>
@@ -0,0 +1,16 @@
1
+ #{rodauth.two_factor_setup_heading unless rodauth.two_factor_setup_links.empty?}
2
+
3
+ <ul class="rodauth-links rodauth-multifactor-setup-links">
4
+ #{rodauth.two_factor_setup_links.sort.map do |_, link, text|
5
+ "<li><a href=\"#{h link}\">#{h text}</a></li>"
6
+ end.join("\n")}
7
+ </ul>
8
+
9
+ #{rodauth.two_factor_remove_heading unless rodauth.two_factor_remove_links.empty?}
10
+
11
+ <ul class="rodauth-links rodauth-multifactor-remove-links">
12
+ #{rodauth.two_factor_remove_links.sort.map do |_, link, text|
13
+ "<li><a href=\"#{h link}\">#{h text}</a></li>"
14
+ end.join("\n")}
15
+ #{"<li><a href=\"#{h rodauth.two_factor_disable_path}\">#{rodauth.two_factor_disable_link_text}</a></li>" if rodauth.two_factor_remove_links.length > 1}
16
+ </ul>
@@ -1,7 +1,7 @@
1
- <form action="#{rodauth.unlock_account_request_path}" method="post" class="rodauth form-horizontal" role="form" id="unlock-account-request-form">
1
+ <form action="#{rodauth.unlock_account_request_path}" method="post" class="rodauth" role="form" id="unlock-account-request-form">
2
2
  #{rodauth.unlock_account_request_additional_form_tags}
3
3
  #{rodauth.csrf_tag(rodauth.unlock_account_request_path)}
4
4
  #{rodauth.login_hidden_field}
5
5
  #{rodauth.unlock_account_request_explanatory_text}
6
- <input type="submit" class="btn btn-primary inline" value="#{rodauth.unlock_account_request_button}"/>
6
+ #{rodauth.button(rodauth.unlock_account_request_button)}
7
7
  </form>
@@ -1,4 +1,4 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="unlock-account-form">
1
+ <form method="post" class="rodauth" role="form" id="unlock-account-form">
2
2
  #{rodauth.unlock_account_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.unlock_account_explanatory_text}
@@ -1,4 +1,4 @@
1
- <form action="#{rodauth.verify_account_resend_path}" method="post" class="rodauth form-horizontal" role="form" id="verify-account-resend-form">
1
+ <form action="#{rodauth.verify_account_resend_path}" method="post" class="rodauth" role="form" id="verify-account-resend-form">
2
2
  #{rodauth.verify_account_resend_additional_form_tags}
3
3
  #{rodauth.csrf_tag(rodauth.verify_account_resend_path)}
4
4
  #{rodauth.verify_account_resend_explanatory_text}
@@ -1,8 +1,7 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="verify-account-form">
1
+ <form method="post" class="rodauth" role="form" id="verify-account-form">
2
2
  #{rodauth.verify_account_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('password-field') if rodauth.verify_account_set_password?}
5
5
  #{rodauth.render('password-confirm-field') if rodauth.verify_account_set_password? && rodauth.require_password_confirmation?}
6
6
  #{rodauth.button(rodauth.verify_account_button)}
7
7
  </form>
8
-
@@ -1,4 +1,4 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="verify-login-change-form">
1
+ <form method="post" class="rodauth" role="form" id="verify-login-change-form">
2
2
  #{rodauth.verify_login_change_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.button(rodauth.verify_login_change_button)}
@@ -0,0 +1,11 @@
1
+ <form method="post" action="#{rodauth.webauthn_auth_form_path}" class="rodauth" role="form" id="webauthn-auth-form" data-credential-options="#{h((cred = rodauth.webauth_credential_options_for_get).as_json.to_json)}">
2
+ #{rodauth.webauthn_auth_additional_form_tags}
3
+ #{rodauth.csrf_tag(rodauth.webauthn_auth_form_path)}
4
+ <input type="hidden" name="#{rodauth.webauthn_auth_challenge_param}" value="#{cred.challenge}" />
5
+ <input type="hidden" name="#{rodauth.webauthn_auth_challenge_hmac_param}" value="#{rodauth.compute_hmac(cred.challenge)}" />
6
+ <input class="rodauth_hidden" aria-hidden="true" type="text" name="#{rodauth.webauthn_auth_param}" id="webauthn-auth" value="" />
7
+ <div id="webauthn-auth-button">
8
+ #{rodauth.button(rodauth.webauthn_auth_button)}
9
+ </div>
10
+ </form>
11
+ <script src="#{rodauth.webauthn_js_host}#{rodauth.webauthn_auth_js_path}"></script>
@@ -0,0 +1,14 @@
1
+ <form method="post" class="rodauth" role="form" id="webauthn-remove-form">
2
+ #{rodauth.webauthn_remove_additional_form_tags}
3
+ #{rodauth.csrf_tag}
4
+ #{rodauth.render('password-field') if rodauth.two_factor_modifications_require_password?}
5
+ <fieldset class="form-group">
6
+ #{(usage = rodauth.account_webauthn_usage; last_id = usage.keys.last; usage;).map do |id, last_use|
7
+ input = rodauth.input_field_string(rodauth.webauthn_remove_param, "webauthn-remove-#{h id}", :type=>'radio', :class=>"form-check-input", :skip_error_message=>true, :value=>id, :required=>false)
8
+ label = "<label class=\"rodauth-webauthn-id form-check-label\" for=\"webauthn-remove-#{h id}\">Last Use: #{last_use}</label>"
9
+ error = rodauth.formatted_field_error(rodauth.webauthn_remove_param) if id == last_id
10
+ "<div class=\"form-check radio\">#{input}#{label}#{error}</div>"
11
+ end.join("\n")}
12
+ </fieldset>
13
+ #{rodauth.button(rodauth.webauthn_remove_button)}
14
+ </form>
@@ -0,0 +1,12 @@
1
+ <form method="post" class="rodauth" role="form" id="webauthn-setup-form" data-credential-options="#{h((cred = rodauth.new_webauthn_credential).as_json.to_json)}">
2
+ #{rodauth.webauthn_setup_additional_form_tags}
3
+ #{rodauth.csrf_tag}
4
+ <input type="hidden" name="#{rodauth.webauthn_setup_challenge_param}" value="#{cred.challenge}" />
5
+ <input type="hidden" name="#{rodauth.webauthn_setup_challenge_hmac_param}" value="#{rodauth.compute_hmac(cred.challenge)}" />
6
+ <input class="rodauth_hidden" aria-hidden="true" type="text" name="#{rodauth.webauthn_setup_param}" id="webauthn-setup" value="" />
7
+ #{rodauth.render('password-field') if rodauth.two_factor_modifications_require_password?}
8
+ <div id="webauthn-setup-button">
9
+ #{rodauth.button(rodauth.webauthn_setup_button)}
10
+ </div>
11
+ </form>
12
+ <script src="#{rodauth.webauthn_js_host}#{rodauth.webauthn_setup_js_path}"></script>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rodauth
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.23.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-06 00:00:00.000000000 Z
11
+ date: 2020-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: webauthn
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">"
144
+ - !ruby/object:Gem::Version
145
+ version: '2'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">"
151
+ - !ruby/object:Gem::Version
152
+ version: '2'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: minitest
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -193,9 +207,9 @@ dependencies:
193
207
  - !ruby/object:Gem::Version
194
208
  version: 2.1.0
195
209
  description: |
196
- Rodauth is an authentication and account management framework for
197
- rack applications. It's built using Roda and Sequel, but it can
198
- be used as middleware in front of web applications that use
210
+ Rodauth is Ruby's most advanced authentication framework, designed
211
+ to work in all rack applications. It's built using Roda and Sequel,
212
+ but it can be used as middleware in front of web applications that use
199
213
  other web frameworks and database libraries.
200
214
 
201
215
  Rodauth aims to provide strong security for password storage by
@@ -203,6 +217,19 @@ description: |
203
217
  MySQL, and Microsoft SQL Server. Configuration is done via
204
218
  a DSL that makes it easy to override any part of the authentication
205
219
  process.
220
+
221
+ Rodauth supports typical authentication features: such as login and
222
+ logout, changing logins and passwords, and creating, verifying,
223
+ unlocking, and resetting passwords for accounts. Rodauth also
224
+ supports many advanced authentication features:
225
+
226
+ * Secure password storage using security definer database functions
227
+ * Multiple primary multifactor authentication methods (WebAuthn and
228
+ TOTP), as well as backup multifactor authentication methods (SMS
229
+ and recovery codes).
230
+ * Passwordless authentication using email links and WebAuthn
231
+ authenticators.
232
+ * Both standard HTML form and JSON API support for all features.
206
233
  email: code@jeremyevans.net
207
234
  executables: []
208
235
  extensions: []
@@ -220,7 +247,6 @@ extra_rdoc_files:
220
247
  - doc/http_basic_auth.rdoc
221
248
  - doc/create_account.rdoc
222
249
  - doc/email_base.rdoc
223
- - doc/internals.rdoc
224
250
  - doc/disallow_common_passwords.rdoc
225
251
  - doc/disallow_password_reuse.rdoc
226
252
  - doc/password_complexity.rdoc
@@ -230,7 +256,7 @@ extra_rdoc_files:
230
256
  - doc/logout.rdoc
231
257
  - doc/otp.rdoc
232
258
  - doc/login_password_requirements_base.rdoc
233
- - doc/verify_change_login.rdoc
259
+ - doc/jwt_cors.rdoc
234
260
  - doc/password_expiration.rdoc
235
261
  - doc/password_grace_period.rdoc
236
262
  - doc/recovery_codes.rdoc
@@ -246,7 +272,12 @@ extra_rdoc_files:
246
272
  - doc/jwt_refresh.rdoc
247
273
  - doc/verify_account_grace_period.rdoc
248
274
  - doc/verify_login_change.rdoc
249
- - doc/jwt_cors.rdoc
275
+ - doc/webauthn.rdoc
276
+ - doc/webauthn_login.rdoc
277
+ - doc/webauthn_verify_account.rdoc
278
+ - doc/active_sessions.rdoc
279
+ - doc/audit_logging.rdoc
280
+ - doc/password_pepper.rdoc
250
281
  - doc/release_notes/1.17.0.txt
251
282
  - doc/release_notes/1.0.0.txt
252
283
  - doc/release_notes/1.1.0.txt
@@ -271,12 +302,19 @@ extra_rdoc_files:
271
302
  - doc/release_notes/1.21.0.txt
272
303
  - doc/release_notes/1.22.0.txt
273
304
  - doc/release_notes/1.23.0.txt
305
+ - doc/release_notes/2.0.0.txt
306
+ - doc/release_notes/2.1.0.txt
307
+ - doc/release_notes/2.2.0.txt
308
+ - doc/release_notes/2.3.0.txt
309
+ - doc/release_notes/2.4.0.txt
274
310
  files:
275
311
  - CHANGELOG
276
312
  - MIT-LICENSE
277
313
  - README.rdoc
278
314
  - dict/top-10_000-passwords.txt
279
315
  - doc/account_expiration.rdoc
316
+ - doc/active_sessions.rdoc
317
+ - doc/audit_logging.rdoc
280
318
  - doc/base.rdoc
281
319
  - doc/change_login.rdoc
282
320
  - doc/change_password.rdoc
@@ -288,8 +326,28 @@ files:
288
326
  - doc/disallow_password_reuse.rdoc
289
327
  - doc/email_auth.rdoc
290
328
  - doc/email_base.rdoc
329
+ - doc/guides/admin_activation.rdoc
330
+ - doc/guides/already_authenticated.rdoc
331
+ - doc/guides/alternative_login.rdoc
332
+ - doc/guides/create_account_programmatically.rdoc
333
+ - doc/guides/delay_password.rdoc
334
+ - doc/guides/email_only.rdoc
335
+ - doc/guides/i18n.rdoc
336
+ - doc/guides/internals.rdoc
337
+ - doc/guides/links.rdoc
338
+ - doc/guides/login_return.rdoc
339
+ - doc/guides/password_column.rdoc
340
+ - doc/guides/password_confirmation.rdoc
341
+ - doc/guides/password_requirements.rdoc
342
+ - doc/guides/paths.rdoc
343
+ - doc/guides/query_params.rdoc
344
+ - doc/guides/redirects.rdoc
345
+ - doc/guides/registration_field.rdoc
346
+ - doc/guides/require_mfa.rdoc
347
+ - doc/guides/reset_password_autologin.rdoc
348
+ - doc/guides/status_column.rdoc
349
+ - doc/guides/totp_or_recovery.rdoc
291
350
  - doc/http_basic_auth.rdoc
292
- - doc/internals.rdoc
293
351
  - doc/jwt.rdoc
294
352
  - doc/jwt_cors.rdoc
295
353
  - doc/jwt_refresh.rdoc
@@ -301,6 +359,7 @@ files:
301
359
  - doc/password_complexity.rdoc
302
360
  - doc/password_expiration.rdoc
303
361
  - doc/password_grace_period.rdoc
362
+ - doc/password_pepper.rdoc
304
363
  - doc/recovery_codes.rdoc
305
364
  - doc/release_notes/1.0.0.txt
306
365
  - doc/release_notes/1.1.0.txt
@@ -326,6 +385,11 @@ files:
326
385
  - doc/release_notes/1.7.0.txt
327
386
  - doc/release_notes/1.8.0.txt
328
387
  - doc/release_notes/1.9.0.txt
388
+ - doc/release_notes/2.0.0.txt
389
+ - doc/release_notes/2.1.0.txt
390
+ - doc/release_notes/2.2.0.txt
391
+ - doc/release_notes/2.3.0.txt
392
+ - doc/release_notes/2.4.0.txt
329
393
  - doc/remember.rdoc
330
394
  - doc/reset_password.rdoc
331
395
  - doc/session_expiration.rdoc
@@ -335,11 +399,17 @@ files:
335
399
  - doc/update_password_hash.rdoc
336
400
  - doc/verify_account.rdoc
337
401
  - doc/verify_account_grace_period.rdoc
338
- - doc/verify_change_login.rdoc
339
402
  - doc/verify_login_change.rdoc
403
+ - doc/webauthn.rdoc
404
+ - doc/webauthn_login.rdoc
405
+ - doc/webauthn_verify_account.rdoc
406
+ - javascript/webauthn_auth.js
407
+ - javascript/webauthn_setup.js
340
408
  - lib/roda/plugins/rodauth.rb
341
409
  - lib/rodauth.rb
342
410
  - lib/rodauth/features/account_expiration.rb
411
+ - lib/rodauth/features/active_sessions.rb
412
+ - lib/rodauth/features/audit_logging.rb
343
413
  - lib/rodauth/features/base.rb
344
414
  - lib/rodauth/features/change_login.rb
345
415
  - lib/rodauth/features/change_password.rb
@@ -363,6 +433,7 @@ files:
363
433
  - lib/rodauth/features/password_complexity.rb
364
434
  - lib/rodauth/features/password_expiration.rb
365
435
  - lib/rodauth/features/password_grace_period.rb
436
+ - lib/rodauth/features/password_pepper.rb
366
437
  - lib/rodauth/features/recovery_codes.rb
367
438
  - lib/rodauth/features/remember.rb
368
439
  - lib/rodauth/features/reset_password.rb
@@ -373,8 +444,10 @@ files:
373
444
  - lib/rodauth/features/update_password_hash.rb
374
445
  - lib/rodauth/features/verify_account.rb
375
446
  - lib/rodauth/features/verify_account_grace_period.rb
376
- - lib/rodauth/features/verify_change_login.rb
377
447
  - lib/rodauth/features/verify_login_change.rb
448
+ - lib/rodauth/features/webauthn.rb
449
+ - lib/rodauth/features/webauthn_login.rb
450
+ - lib/rodauth/features/webauthn_verify_account.rb
378
451
  - lib/rodauth/migrations.rb
379
452
  - lib/rodauth/version.rb
380
453
  - templates/add-recovery-codes.str
@@ -387,11 +460,15 @@ files:
387
460
  - templates/email-auth-email.str
388
461
  - templates/email-auth-request-form.str
389
462
  - templates/email-auth.str
463
+ - templates/global-logout-field.str
390
464
  - templates/login-confirm-field.str
391
465
  - templates/login-display.str
392
466
  - templates/login-field.str
467
+ - templates/login-form-footer.str
468
+ - templates/login-form.str
393
469
  - templates/login.str
394
470
  - templates/logout.str
471
+ - templates/multi-phase-login.str
395
472
  - templates/otp-auth-code-field.str
396
473
  - templates/otp-auth.str
397
474
  - templates/otp-disable.str
@@ -411,6 +488,9 @@ files:
411
488
  - templates/sms-disable.str
412
489
  - templates/sms-request.str
413
490
  - templates/sms-setup.str
491
+ - templates/two-factor-auth.str
492
+ - templates/two-factor-disable.str
493
+ - templates/two-factor-manage.str
414
494
  - templates/unlock-account-email.str
415
495
  - templates/unlock-account-request.str
416
496
  - templates/unlock-account.str
@@ -419,6 +499,9 @@ files:
419
499
  - templates/verify-account.str
420
500
  - templates/verify-login-change-email.str
421
501
  - templates/verify-login-change.str
502
+ - templates/webauthn-auth.str
503
+ - templates/webauthn-remove.str
504
+ - templates/webauthn-setup.str
422
505
  homepage: https://github.com/jeremyevans/rodauth
423
506
  licenses:
424
507
  - MIT
@@ -434,7 +517,7 @@ rdoc_options:
434
517
  - "--line-numbers"
435
518
  - "--inline-source"
436
519
  - "--title"
437
- - 'Rodauth: Authentication and Account Management Framework for Rack Applications'
520
+ - 'Rodauth: Ruby''s Most Advanced Authentication Framework'
438
521
  - "--main"
439
522
  - README.rdoc
440
523
  require_paths:
@@ -443,7 +526,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
443
526
  requirements:
444
527
  - - ">="
445
528
  - !ruby/object:Gem::Version
446
- version: 1.8.7
529
+ version: 1.9.2
447
530
  required_rubygems_version: !ruby/object:Gem::Requirement
448
531
  requirements:
449
532
  - - ">="