rodauth-rails 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40b75a97a14021dafe773b2585d66d6ceef7498dddcef146498721bf39e57426
4
- data.tar.gz: 270bac846036bfd32945e71116e6816db4d51ec752ec6ff354be8f38dd206da9
3
+ metadata.gz: 60fda35b195285a7c9cc14e07153d80faa9e939cf2944fbb04e1360baf30e306
4
+ data.tar.gz: 1f89bcfff28e6d08287fa67a9fe9228a2d61f15a8a9cdecb9fcf138137d72c47
5
5
  SHA512:
6
- metadata.gz: 46e413275b4aca41959f36fb21d5fa3fd55eb6c73f87c6eda42a6eb8e36c5886913ad01e6e80394923f38236810aad4d608064f1f51661367798e8da70a9fd11
7
- data.tar.gz: 22779086e32ced89a113d33e6b123c64f7f6094e1e41d0b99a741d38c3bbfc3ed64a0894d5b656754717cd11b50c83cd541039c5a8d094ffa3e37e1ed7f592ff
6
+ metadata.gz: 8e4ed3afbe7a114ba36f19541d1c8c8ee62de07526400230b1386f027b05876cd78ad88bdb40cae9767e74f83d1532d4939d97d03657662933f81d7086df34d9
7
+ data.tar.gz: cae1fc15a86f1b2e2423a8e54f36b844f610ba23ff74fd9ced132200e9816260028682c0efea1dcf19cf8a722a7ae49882c8d31c670e268e229117b4f6fb84f2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 0.9.0 (2021-02-07)
2
+
3
+ * Load Roda's JSON support by default, so that enabling `json`/`jwt` feature is all that's needed (@janko)
4
+
5
+ * Bump Rodauth dependency to 2.9+ (@janko)
6
+
7
+ * Add `--json` option for `rodauth:install` generator for configuring `json` feature (@janko)
8
+
9
+ * Add `--jwt` option for `rodauth:install` generator for configuring `jwt` feature (@janko)
10
+
11
+ * Remove the `--api` option from `rodauth:install` generator (@janko)
12
+
1
13
  ## 0.8.2 (2021-01-10)
2
14
 
3
15
  * Reset Rails session on `#clear_session`, protecting from potential session fixation attacks (@janko)
data/README.md CHANGED
@@ -2,6 +2,35 @@
2
2
 
3
3
  Provides Rails integration for the [Rodauth] authentication framework.
4
4
 
5
+ ## Table of contents
6
+
7
+ * [Resources](#resources)
8
+ * [Why Rodauth?](#why-rodauth)
9
+ * [Upgrading](#upgrading)
10
+ * [Installation](#installation)
11
+ * [Usage](#usage)
12
+ - [Routes](#routes)
13
+ - [Current account](#current-account)
14
+ - [Requiring authentication](#requiring-authentication)
15
+ - [Views](#views)
16
+ - [Mailer](#mailer)
17
+ - [Migrations](#migrations)
18
+ - [Multiple configurations](#multiple-configurations)
19
+ - [Calling controller methods](#calling-controller-methods)
20
+ - [Rodauth instance](#rodauth-instance)
21
+ * [How it works](#how-it-works)
22
+ - [Middleware](#middleware)
23
+ - [App](#app)
24
+ - [Sequel](#sequel)
25
+ * [JSON API](#json-api)
26
+ * [OmniAuth](#omniauth)
27
+ * [Configuring](#configuring)
28
+ * [Custom extensions](#custom-extensions)
29
+ * [Testing](#testing)
30
+ * [Rodauth defaults](#rodauth-defaults)
31
+ - [Database functions](#database-functions)
32
+ - [Account statuses](#account-statuses)
33
+
5
34
  ## Resources
6
35
 
7
36
  Useful links:
@@ -18,11 +47,11 @@ Articles:
18
47
  ## Why Rodauth?
19
48
 
20
49
  There are already several popular authentication solutions for Rails (Devise,
21
- Sorcery, Clearance, Authlogic), so why would you choose Rodauth? Well, because
22
- it has many advantages over the mentioned alternatives:
50
+ Sorcery, Clearance, Authlogic), so why would you choose Rodauth? Here are some
51
+ of the advantages that stand out for me:
23
52
 
24
53
  * multifactor authentication ([TOTP][otp], [SMS codes][sms_codes], [recovery codes][recovery_codes], [WebAuthn][webauthn])
25
- * standardized [JSON API support][jwt] (for every feature)
54
+ * standardized [JSON API support][json] for every feature (including [JWT][jwt])
26
55
  * enterprise security features ([password complexity][password_complexity], [disallow password reuse][disallow_password_reuse], [password expiration][password_expiration], [session expiration][session_expiration], [single session][single_session], [account expiration][account_expiration])
27
56
  * [email authentication][email_auth] (aka "passwordless")
28
57
  * [audit logging][audit_logging] (for any action)
@@ -54,7 +83,7 @@ documentation][hmac] for instructions on how to safely transition, or just set
54
83
  Add the gem to your Gemfile:
55
84
 
56
85
  ```rb
57
- gem "rodauth-rails", "~> 0.6"
86
+ gem "rodauth-rails", "~> 0.9"
58
87
 
59
88
  # gem "jwt", require: false # for JWT feature
60
89
  # gem "rotp", require: false # for OTP feature
@@ -73,7 +102,9 @@ $ rails generate rodauth:install
73
102
  Or if you want Rodauth endpoints to be exposed via JSON API:
74
103
 
75
104
  ```sh
76
- $ rails generate rodauth:install --api
105
+ $ rails generate rodauth:install --json # regular authentication using the Rails session
106
+ # or
107
+ $ rails generate rodauth:install --jwt # token authentication via the "Authorization" header
77
108
  $ bundle add jwt
78
109
  ```
79
110
 
@@ -481,6 +512,42 @@ class CreateRodauthOtpSmsCodesRecoveryCodes < ActiveRecord::Migration
481
512
  end
482
513
  ```
483
514
 
515
+ ### Multiple configurations
516
+
517
+ If you need to handle multiple types of accounts that require different
518
+ authentication logic, you can create different configurations for them:
519
+
520
+ ```rb
521
+ # app/lib/rodauth_app.rb
522
+ class RodauthApp < Rodauth::Rails::App
523
+ # primary configuration
524
+ configure do
525
+ # ...
526
+ end
527
+
528
+ # alternative configuration
529
+ configure(:admin) do
530
+ # ... enable features ...
531
+ prefix "/admin"
532
+ session_key_prefix "admin_"
533
+ remember_cookie_key "_admin_remember" # if using remember feature
534
+ # ...
535
+ end
536
+
537
+ route do |r|
538
+ r.rodauth
539
+ r.on("admin") { r.rodauth(:admin) }
540
+ # ...
541
+ end
542
+ end
543
+ ```
544
+
545
+ Then in your application you can reference the secondary Rodauth instance:
546
+
547
+ ```rb
548
+ rodauth(:admin).login_path #=> "/admin/login"
549
+ ```
550
+
484
551
  ### Calling controller methods
485
552
 
486
553
  When using Rodauth before/after hooks or generally overriding your Rodauth
@@ -514,7 +581,7 @@ Rodauth operations outside of the request context. rodauth-rails gives you the
514
581
  ability to retrieve the Rodauth instance:
515
582
 
516
583
  ```rb
517
- rodauth = Rodauth::Rails.rodauth # or Rodauth::Rails.rodauth(:secondary)
584
+ rodauth = Rodauth::Rails.rodauth # or Rodauth::Rails.rodauth(:admin)
518
585
 
519
586
  rodauth.login_url #=> "https://example.com/login"
520
587
  rodauth.account_from_login("user@example.com") # loads user by email
@@ -545,8 +612,8 @@ The Rodauth app stores the `Rodauth::Auth` instance in the Rack env hash, which
545
612
  is then available in your Rails app:
546
613
 
547
614
  ```rb
548
- request.env["rodauth"] #=> #<Rodauth::Auth>
549
- request.env["rodauth.secondary"] #=> #<Rodauth::Auth> (if using multiple configurations)
615
+ request.env["rodauth"] #=> #<Rodauth::Auth>
616
+ request.env["rodauth.admin"] #=> #<Rodauth::Auth> (if using multiple configurations)
550
617
  ```
551
618
 
552
619
  For convenience, this object can be accessed via the `#rodauth` method in views
@@ -555,14 +622,14 @@ and controllers:
555
622
  ```rb
556
623
  class MyController < ApplicationController
557
624
  def my_action
558
- rodauth #=> #<Rodauth::Auth>
559
- rodauth(:secondary) #=> #<Rodauth::Auth> (if using multiple configurations)
625
+ rodauth #=> #<Rodauth::Auth>
626
+ rodauth(:admin) #=> #<Rodauth::Auth> (if using multiple configurations)
560
627
  end
561
628
  end
562
629
  ```
563
630
  ```erb
564
- <% rodauth #=> #<Rodauth::Auth> %>
565
- <% rodauth(:secondary) #=> #<Rodauth::Auth> (if using multiple configurations) %>
631
+ <% rodauth #=> #<Rodauth::Auth> %>
632
+ <% rodauth(:admin) #=> #<Rodauth::Auth> (if using multiple configurations) %>
566
633
  ```
567
634
 
568
635
  ### App
@@ -584,7 +651,7 @@ any additional [plugin options].
584
651
  class RodauthApp < Rodauth::Rails::App
585
652
  configure { ... } # defining default Rodauth configuration
586
653
  configure(json: true) { ... } # passing options to the Rodauth plugin
587
- configure(:secondary) { ... } # defining multiple Rodauth configurations
654
+ configure(:admin) { ... } # defining multiple Rodauth configurations
588
655
  end
589
656
  ```
590
657
 
@@ -619,15 +686,32 @@ function calls).
619
686
 
620
687
  If ActiveRecord is used in the application, the `rodauth:install` generator
621
688
  will have automatically configured Sequel to reuse ActiveRecord's database
622
- connection (using the [sequel-activerecord_connection] gem).
689
+ connection, using the [sequel-activerecord_connection] gem.
623
690
 
624
691
  This means that, from the usage perspective, Sequel can be considered just
625
692
  as an implementation detail of Rodauth.
626
693
 
627
694
  ## JSON API
628
695
 
629
- JSON API support in Rodauth is provided by the [JWT feature][jwt]. You'll need
630
- to install the [JWT gem], enable JSON support and enable the JWT feature:
696
+ To make Rodauth endpoints accessible via JSON API, enable the [`json`][json]
697
+ feature:
698
+
699
+ ```rb
700
+ # app/lib/rodauth_app.rb
701
+ class RodauthApp < Rodauth::Rails::App
702
+ configure do
703
+ # ...
704
+ enable :json
705
+ only_json? true # accept only JSON requests
706
+ # ...
707
+ end
708
+ end
709
+ ```
710
+
711
+ This will store account session data into the Rails session. If you rather want
712
+ stateless token-based authentication via the `Authorization` header, enable the
713
+ [`jwt`][jwt] feature (which builds on top of the `json` feature) and add the
714
+ [JWT gem] to the Gemfile:
631
715
 
632
716
  ```sh
633
717
  $ bundle add jwt
@@ -635,24 +719,16 @@ $ bundle add jwt
635
719
  ```rb
636
720
  # app/lib/rodauth_app.rb
637
721
  class RodauthApp < Rodauth::Rails::App
638
- configure(json: :only) do
722
+ configure do
639
723
  # ...
640
724
  enable :jwt
641
- # make sure to store the JWT secret below in a safe place
642
- jwt_secret "...your secret key..."
725
+ jwt_secret "<YOUR_SECRET_KEY>" # store the JWT secret in a safe place
726
+ only_json? true # accept only JSON requests
643
727
  # ...
644
728
  end
645
729
  end
646
730
  ```
647
731
 
648
- With the above configuration, Rodauth routes will only be accessible via JSON
649
- requests. If you still want to allow HTML access alongside JSON, change `json:
650
- :only` to `json: true`.
651
-
652
- Emails will automatically work in JSON-only mode, because `Rodauth::Rails::App`
653
- comes with Roda's `render` plugin loaded. They are customized the same as in
654
- the non-JSON case.
655
-
656
732
  ## OmniAuth
657
733
 
658
734
  While Rodauth doesn't yet come with [OmniAuth] integration, we can build one
@@ -976,6 +1052,7 @@ conduct](https://github.com/janko/rodauth-rails/blob/master/CODE_OF_CONDUCT.md).
976
1052
  [sms_codes]: http://rodauth.jeremyevans.net/rdoc/files/doc/sms_codes_rdoc.html
977
1053
  [recovery_codes]: http://rodauth.jeremyevans.net/rdoc/files/doc/recovery_codes_rdoc.html
978
1054
  [webauthn]: http://rodauth.jeremyevans.net/rdoc/files/doc/webauthn_rdoc.html
1055
+ [json]: http://rodauth.jeremyevans.net/rdoc/files/doc/json_rdoc.html
979
1056
  [jwt]: http://rodauth.jeremyevans.net/rdoc/files/doc/jwt_rdoc.html
980
1057
  [email_auth]: http://rodauth.jeremyevans.net/rdoc/files/doc/email_auth_rdoc.html
981
1058
  [audit_logging]: http://rodauth.jeremyevans.net/rdoc/files/doc/audit_logging_rdoc.html
@@ -13,14 +13,8 @@ module Rodauth
13
13
  source_root "#{__dir__}/templates"
14
14
  namespace "rodauth:install"
15
15
 
16
- # The :api option is a Rails-recognized option that always
17
- # defaults to false, so we make it use our provided default
18
- # value instead.
19
- def self.default_value_for_option(name, options)
20
- name == :api ? options[:default] : super
21
- end
22
-
23
- class_option :api, type: :boolean, desc: "Generate JSON-only configuration"
16
+ class_option :json, type: :boolean, desc: "Configure JSON support"
17
+ class_option :jwt, type: :boolean, desc: "Configure JWT support"
24
18
 
25
19
  def create_rodauth_migration
26
20
  return unless defined?(ActiveRecord::Base)
@@ -83,17 +77,17 @@ module Rodauth
83
77
  end
84
78
  end
85
79
 
86
- def api_only?
87
- if options.key?(:api)
88
- options[:api]
89
- elsif ::Rails.gem_version >= Gem::Version.new("5.0")
90
- ::Rails.application.config.api_only
91
- end
80
+ def json?
81
+ options[:json]
82
+ end
83
+
84
+ def jwt?
85
+ options[:jwt] || Rodauth::Rails.api_only?
92
86
  end
93
87
 
94
88
  def migration_features
95
89
  features = [:base, :reset_password, :verify_account, :verify_login_change]
96
- features << :remember unless api_only?
90
+ features << :remember unless jwt?
97
91
  features
98
92
  end
99
93
  end
@@ -1,11 +1,11 @@
1
1
  class RodauthApp < Rodauth::Rails::App
2
- configure<%= " json: :only" if api_only? %> do
2
+ configure do
3
3
  # List of authentication features that are loaded.
4
4
  enable :create_account, :verify_account, :verify_account_grace_period,
5
- :login, :logout, <%= api_only? ? ":jwt" : ":remember" %>,
5
+ :login, :logout<%= ", :remember" unless jwt? %>,
6
6
  :reset_password, :change_password, :change_password_notify,
7
7
  :change_login, :verify_login_change,
8
- :close_account
8
+ :close_account<%= ", :json" if json? %><%= ", :jwt" if jwt? %>
9
9
 
10
10
  # See the Rodauth documentation for the list of available config options:
11
11
  # http://rodauth.jeremyevans.net/documentation.html
@@ -14,6 +14,16 @@ class RodauthApp < Rodauth::Rails::App
14
14
  # The secret key used for hashing public-facing tokens for various features.
15
15
  # Defaults to Rails `secret_key_base`, but you can use your own secret key.
16
16
  # hmac_secret "<%= SecureRandom.hex(64) %>"
17
+ <% if jwt? -%>
18
+
19
+ # Set JWT secret, which is used to cryptographically protect the token.
20
+ jwt_secret "<%= SecureRandom.hex(64) %>"
21
+ <% end -%>
22
+ <% if json? || jwt? -%>
23
+
24
+ # Accept only JSON requests.
25
+ only_json? true
26
+ <% end -%>
17
27
 
18
28
  # Specify the controller used for view rendering and CSRF verification.
19
29
  rails_controller { RodauthController }
@@ -42,18 +52,6 @@ class RodauthApp < Rodauth::Rails::App
42
52
 
43
53
  # Redirect to the app from login and registration pages if already logged in.
44
54
  # already_logged_in { redirect login_redirect }
45
- <% if api_only? -%>
46
-
47
- # ==> JWT
48
- # Set JWT secret, which is used to cryptographically protect the token.
49
- jwt_secret "<%= SecureRandom.hex(64) %>"
50
-
51
- # Don't require login confirmation param.
52
- require_login_confirmation? false
53
-
54
- # Don't require password confirmation param.
55
- require_password_confirmation? false
56
- <% end -%>
57
55
 
58
56
  # ==> Emails
59
57
  # Uncomment the lines below once you've imported mailer views.
@@ -80,14 +78,14 @@ class RodauthApp < Rodauth::Rails::App
80
78
  # db.after_commit { email.deliver_later }
81
79
  # end
82
80
 
83
- # In the meantime you can tweak settings for emails created by Rodauth
81
+ # In the meantime, you can tweak settings for emails created by Rodauth.
84
82
  # email_subject_prefix "[MyApp] "
85
83
  # email_from "noreply@myapp.com"
86
84
  # send_email(&:deliver_later)
87
85
  # reset_password_email_body { "Click here to reset your password: #{reset_password_email_link}" }
88
86
 
89
87
  # ==> Flash
90
- <% unless api_only? -%>
88
+ <% unless json? || jwt? -%>
91
89
  # Match flash keys with ones already used in the Rails app.
92
90
  # flash_notice_key :success # default is :notice
93
91
  # flash_error_key :error # default is :alert
@@ -107,7 +105,7 @@ class RodauthApp < Rodauth::Rails::App
107
105
 
108
106
  # Change minimum number of password characters required when creating an account.
109
107
  # password_minimum_length 8
110
- <% unless api_only? -%>
108
+ <% unless jwt? -%>
111
109
 
112
110
  # ==> Remember Feature
113
111
  # Remember all logged in users.
@@ -128,13 +126,14 @@ class RodauthApp < Rodauth::Rails::App
128
126
 
129
127
  # Perform additional actions after the account is created.
130
128
  # after_create_account do
131
- # Profile.create!(account_id: account[:id], name: param("name"))
129
+ # Profile.create!(account_id: account_id, name: param("name"))
132
130
  # end
133
131
 
134
132
  # Do additional cleanup after the account is closed.
135
133
  # after_close_account do
136
- # Profile.find_by!(account_id: account[:id]).destroy
134
+ # Profile.find_by!(account_id: account_id).destroy
137
135
  # end
136
+ <% unless json? || jwt? -%>
138
137
 
139
138
  # ==> Redirects
140
139
  # Redirect to home page after logout.
@@ -145,6 +144,7 @@ class RodauthApp < Rodauth::Rails::App
145
144
 
146
145
  # Redirect to login page after password reset.
147
146
  reset_password_redirect { login_path }
147
+ <% end -%>
148
148
 
149
149
  # ==> Deadlines
150
150
  # Change default deadlines for some actions.
@@ -156,14 +156,13 @@ class RodauthApp < Rodauth::Rails::App
156
156
 
157
157
  # ==> Multiple configurations
158
158
  # configure(:admin) do
159
- # enable :http_basic_auth
160
- #
159
+ # enable :http_basic_auth # enable different set of features
161
160
  # prefix "/admin"
162
- # session_key :admin_id
161
+ # session_key_prefix "admin_"
163
162
  # end
164
163
 
165
164
  route do |r|
166
- <% unless api_only? -%>
165
+ <% unless jwt? -%>
167
166
  rodauth.load_memory # autologin remembered users
168
167
 
169
168
  <% end -%>
data/lib/rodauth/rails.rb CHANGED
@@ -42,6 +42,16 @@ module Rodauth
42
42
  end
43
43
  end
44
44
 
45
+ if ::Rails.gem_version >= Gem::Version.new("5.0")
46
+ def api_only?
47
+ ::Rails.application.config.api_only
48
+ end
49
+ else
50
+ def api_only?
51
+ false
52
+ end
53
+ end
54
+
45
55
  def configure
46
56
  yield self
47
57
  end
@@ -12,22 +12,16 @@ module Rodauth
12
12
  plugin :hooks
13
13
  plugin :render, layout: false
14
14
 
15
- def self.configure(name = nil, **options, &block)
16
- unless options[:json] == :only
17
- require "rodauth/rails/app/flash"
18
- plugin Flash
19
- end
15
+ if defined?(ActionDispatch::Flash) # not in API-only mode
16
+ require "rodauth/rails/app/flash"
17
+ plugin Flash
18
+ end
20
19
 
21
- plugin :rodauth, name: name, csrf: false, flash: false, **options do
20
+ def self.configure(name = nil, **options, &block)
21
+ plugin :rodauth, name: name, csrf: false, flash: false, json: true, **options do
22
22
  # load the Rails integration
23
23
  enable :rails
24
24
 
25
- if options[:json] == :only && ActionPack.version >= Gem::Version.new("5.0")
26
- rails_controller { ActionController::API }
27
- else
28
- rails_controller { ActionController::Base }
29
- end
30
-
31
25
  # database functions are more complex to set up, so disable them by default
32
26
  use_database_authentication_functions? false
33
27
 
@@ -30,10 +30,12 @@ module Rodauth
30
30
  rails_request.flash
31
31
  end
32
32
 
33
- def commit_flash
34
- if ActionPack.version >= Gem::Version.new("5.0")
33
+ if ActionPack.version >= Gem::Version.new("5.0")
34
+ def commit_flash
35
35
  rails_request.commit_flash
36
- else
36
+ end
37
+ else
38
+ def commit_flash
37
39
  # ActionPack 4.2 automatically commits flash
38
40
  end
39
41
  end
@@ -192,6 +192,14 @@ module Rodauth
192
192
  defined?(ActionController::API) && rails_controller <= ActionController::API
193
193
  end
194
194
 
195
+ def rails_controller
196
+ if only_json? && Rodauth::Rails.api_only?
197
+ ActionController::API
198
+ else
199
+ ActionController::Base
200
+ end
201
+ end
202
+
195
203
  # ActionMailer subclass for correct email delivering.
196
204
  class Mailer < ActionMailer::Base
197
205
  def create_email(**options)
@@ -1,5 +1,5 @@
1
1
  module Rodauth
2
2
  module Rails
3
- VERSION = "0.8.2"
3
+ VERSION = "0.9.0"
4
4
  end
5
5
  end
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.require_paths = ["lib"]
18
18
 
19
19
  spec.add_dependency "railties", ">= 4.2", "< 7"
20
- spec.add_dependency "rodauth", "~> 2.8"
20
+ spec.add_dependency "rodauth", "~> 2.9"
21
21
  spec.add_dependency "sequel-activerecord_connection", "~> 1.1"
22
22
  spec.add_dependency "tilt"
23
23
  spec.add_dependency "bcrypt"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rodauth-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janko Marohnić
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-10 00:00:00.000000000 Z
11
+ date: 2021-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -36,14 +36,14 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '2.8'
39
+ version: '2.9'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '2.8'
46
+ version: '2.9'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: sequel-activerecord_connection
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -216,7 +216,7 @@ homepage: https://github.com/janko/rodauth-rails
216
216
  licenses:
217
217
  - MIT
218
218
  metadata: {}
219
- post_install_message:
219
+ post_install_message:
220
220
  rdoc_options: []
221
221
  require_paths:
222
222
  - lib
@@ -231,8 +231,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
231
231
  - !ruby/object:Gem::Version
232
232
  version: '0'
233
233
  requirements: []
234
- rubygems_version: 3.1.4
235
- signing_key:
234
+ rubygems_version: 3.2.3
235
+ signing_key:
236
236
  specification_version: 4
237
237
  summary: Provides Rails integration for Rodauth.
238
238
  test_files: []