authentication-zero 2.16.25 → 2.16.27

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: 7e2f92cea6894605d40f9db5bad75a4cb227a89043a19f8fe79172b83731b226
4
- data.tar.gz: 85801b84481982cabfc5d1bbbbc554893d4597ed70a7550f1f4e299f8b4b81ae
3
+ metadata.gz: 396a7e8c26e49c9b91d5b349155eb5d2cb4dbbd2012bb2a89977cb66c7446e39
4
+ data.tar.gz: 11cdeee70ab80f387208315d585ed0dd0f9cee431b5405e67f77d009bdbfe80d
5
5
  SHA512:
6
- metadata.gz: cc3bddc51a3cbe07dc2dd990ae65b9692699f3dad8d370da99952ee7cedb3c6d31699ee7804e5c0b5b0ff8a8e5b05182a9a1c40d58d04c364d7171f53c193b8d
7
- data.tar.gz: 07bccc4f5eb51fac1da60e82bd3f819f2b29aec97085d73fd13d819ed69b81a704b12bd866e2340b6641ee860563d49a67bea43854a2efa0da23004c9501a598
6
+ metadata.gz: 2be5682d873fdbc960630bc19f5210242813584f1af36667d8737944633436de50c1d72875a493a902dea041c062978805878cf4b4ef5d88b4dd20665d1ad393
7
+ data.tar.gz: 78d17cb5827821a1a30dff4133325d1fd46eab620c6785dfcae0e58c6ac815ff8d21fd3bfecf9b069ecf70f90e8146d6755d58b59863ad6e01d3f1208eafb5a8
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- authentication-zero (2.16.25)
4
+ authentication-zero (2.16.27)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -20,19 +20,15 @@ Since Authentication Zero generates this code into your application instead of b
20
20
 
21
21
  ## Features
22
22
 
23
- - **Simple code**
24
- - **Inspired by hey.com**
23
+ ### Essential
24
+
25
25
  - Sign up
26
26
  - Email and password validations
27
27
  - Checks if a password has been found in any data breach (--pwned)
28
28
  - Authentication by cookie
29
29
  - Authentication by token (--api)
30
- - Passwordless authentication (--passwordless)
31
30
  - Two factor authentication + recovery codes (--two-factor)
32
31
  - Two factor authentication using a hardware security key (--webauthn)
33
- - Social Login with OmniAuth (--omniauthable)
34
- - Send invitations (--invitable)
35
- - Sign-in as button functionallity (--masqueradable)
36
32
  - Verify email using a link with token
37
33
  - Ask password before sensitive data changes, aka: sudo (--sudoable)
38
34
  - Reset the user password and send reset instructions
@@ -44,6 +40,14 @@ Since Authentication Zero generates this code into your application instead of b
44
40
  - Activity log (--trackable)
45
41
  - Log out
46
42
 
43
+ ### More
44
+
45
+ - Social login with omni auth (--omniauthable)
46
+ - Passwordless authentication (--passwordless)
47
+ - Send invitations (--invitable)
48
+ - "Sign-in as" button functionallity (--masqueradable)
49
+
50
+
47
51
  ## Generated code
48
52
 
49
53
  - [has_secure_password](https://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html#method-i-has_secure_password): Adds methods to set and authenticate against a bcrypt password.
@@ -1,3 +1,3 @@
1
1
  module AuthenticationZero
2
- VERSION = "2.16.25"
2
+ VERSION = "2.16.27"
3
3
  end
@@ -26,7 +26,7 @@ class AuthenticationGenerator < Rails::Generators::Base
26
26
  end
27
27
 
28
28
  if redis?
29
- gem "redis", ">= 4.0.1", comment: "Use Redis adapter to run additional authentication features"
29
+ gem "redis", "~> 4.0", comment: "Use Redis adapter to run additional authentication features"
30
30
  gem "kredis", comment: "Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis]"
31
31
  end
32
32
 
@@ -62,68 +62,65 @@ class AuthenticationGenerator < Rails::Generators::Base
62
62
  end
63
63
 
64
64
  def create_migrations
65
- migration_template "migrations/create_users_migration.rb", "#{db_migrate_path}/create_users.rb"
66
- migration_template "migrations/create_sessions_migration.rb", "#{db_migrate_path}/create_sessions.rb"
67
65
  migration_template "migrations/create_email_verification_tokens_migration.rb", "#{db_migrate_path}/create_email_verification_tokens.rb"
68
- migration_template "migrations/create_password_reset_tokens_migration.rb", "#{db_migrate_path}/create_password_reset_tokens.rb"
69
- migration_template "migrations/create_sign_in_tokens_migration.rb", "#{db_migrate_path}/create_sign_in_tokens_migration.rb" if passwordless?
70
66
  migration_template "migrations/create_events_migration.rb", "#{db_migrate_path}/create_events.rb" if options.trackable?
67
+ migration_template "migrations/create_password_reset_tokens_migration.rb", "#{db_migrate_path}/create_password_reset_tokens.rb"
71
68
  migration_template "migrations/create_recovery_codes_migration.rb", "#{db_migrate_path}/create_recovery_codes.rb" if two_factor?
72
69
  migration_template "migrations/create_security_keys_migration.rb", "#{db_migrate_path}/create_security_keys.rb" if webauthn?
70
+ migration_template "migrations/create_sessions_migration.rb", "#{db_migrate_path}/create_sessions.rb"
71
+ migration_template "migrations/create_sign_in_tokens_migration.rb", "#{db_migrate_path}/create_sign_in_tokens_migration.rb" if passwordless?
72
+ migration_template "migrations/create_users_migration.rb", "#{db_migrate_path}/create_users.rb"
73
73
  end
74
74
 
75
75
  def create_models
76
- template "models/user.rb", "app/models/user.rb"
77
- template "models/session.rb", "app/models/session.rb"
78
- template "models/email_verification_token.rb", "app/models/email_verification_token.rb"
79
- template "models/password_reset_token.rb", "app/models/password_reset_token.rb"
80
- template "models/sign_in_token.rb", "app/models/sign_in_token.rb" if passwordless?
81
76
  template "models/current.rb", "app/models/current.rb"
77
+ template "models/email_verification_token.rb", "app/models/email_verification_token.rb"
82
78
  template "models/event.rb", "app/models/event.rb" if options.trackable?
79
+ template "models/password_reset_token.rb", "app/models/password_reset_token.rb"
83
80
  template "models/recovery_code.rb", "app/models/recovery_code.rb" if two_factor?
84
81
  template "models/security_key.rb", "app/models/security_key.rb" if webauthn?
82
+ template "models/session.rb", "app/models/session.rb"
83
+ template "models/sign_in_token.rb", "app/models/sign_in_token.rb" if passwordless?
84
+ template "models/user.rb", "app/models/user.rb"
85
85
  end
86
86
 
87
87
  def create_fixture_file
88
- template "test_unit/users.yml", "test/fixtures/users.yml"
88
+ copy_file "test_unit/users.yml", "test/fixtures/users.yml"
89
89
  end
90
90
 
91
91
  def create_controllers
92
- template "controllers/#{format_folder}/application_controller.rb", "app/controllers/application_controller.rb", force: true
92
+ template "controllers/#{format}/authentications/events_controller.rb", "app/controllers/authentications/events_controller.rb" if options.trackable?
93
93
 
94
- directory "controllers/#{format_folder}/identity", "app/controllers/identity"
94
+ directory "controllers/#{format}/identity", "app/controllers/identity"
95
95
 
96
- if two_factor?
97
- template "controllers/html/two_factor_authentication/profile/totps_controller.rb", "app/controllers/two_factor_authentication/profile/totps_controller.rb"
98
- template "controllers/html/two_factor_authentication/profile/recovery_codes_controller.rb", "app/controllers/two_factor_authentication/profile/recovery_codes_controller.rb"
99
- template "controllers/html/two_factor_authentication/profile/security_keys_controller.rb", "app/controllers/two_factor_authentication/profile/security_keys_controller.rb" if webauthn?
96
+ template "controllers/#{format}/sessions/omniauth_controller.rb", "app/controllers/sessions/omniauth_controller.rb" if omniauthable?
97
+ template "controllers/#{format}/sessions/passwordlesses_controller.rb", "app/controllers/sessions/passwordlesses_controller.rb" if passwordless?
98
+ template "controllers/#{format}/sessions/sudos_controller.rb", "app/controllers/sessions/sudos_controller.rb" if sudoable?
100
99
 
101
- template "controllers/html/two_factor_authentication/challenge/totps_controller.rb", "app/controllers/two_factor_authentication/challenge/totps_controller.rb"
100
+ if two_factor?
102
101
  template "controllers/html/two_factor_authentication/challenge/recovery_codes_controller.rb", "app/controllers/two_factor_authentication/challenge/recovery_codes_controller.rb"
103
102
  template "controllers/html/two_factor_authentication/challenge/security_keys_controller.rb", "app/controllers/two_factor_authentication/challenge/security_keys_controller.rb" if webauthn?
103
+ template "controllers/html/two_factor_authentication/challenge/totps_controller.rb", "app/controllers/two_factor_authentication/challenge/totps_controller.rb"
104
+
105
+ template "controllers/html/two_factor_authentication/profile/recovery_codes_controller.rb", "app/controllers/two_factor_authentication/profile/recovery_codes_controller.rb"
106
+ template "controllers/html/two_factor_authentication/profile/security_keys_controller.rb", "app/controllers/two_factor_authentication/profile/security_keys_controller.rb" if webauthn?
107
+ template "controllers/html/two_factor_authentication/profile/totps_controller.rb", "app/controllers/two_factor_authentication/profile/totps_controller.rb"
104
108
  end
105
109
 
106
- template "controllers/#{format_folder}/sessions_controller.rb", "app/controllers/sessions_controller.rb"
107
- template "controllers/#{format_folder}/passwords_controller.rb", "app/controllers/passwords_controller.rb"
108
- template "controllers/#{format_folder}/invitations_controller.rb", "app/controllers/invitations_controller.rb" if invitable?
109
- template "controllers/#{format_folder}/masquerades_controller.rb", "app/controllers/masquerades_controller.rb" if masqueradable?
110
- template "controllers/#{format_folder}/registrations_controller.rb", "app/controllers/registrations_controller.rb"
111
- template "controllers/#{format_folder}/home_controller.rb", "app/controllers/home_controller.rb" unless options.api?
112
- template "controllers/#{format_folder}/sessions/sudos_controller.rb", "app/controllers/sessions/sudos_controller.rb" if sudoable?
113
- template "controllers/#{format_folder}/sessions/omniauth_controller.rb", "app/controllers/sessions/omniauth_controller.rb" if omniauthable?
114
- template "controllers/#{format_folder}/sessions/passwordlesses_controller.rb", "app/controllers/sessions/passwordlesses_controller.rb" if passwordless?
115
- template "controllers/#{format_folder}/authentications/events_controller.rb", "app/controllers/authentications/events_controller.rb" if options.trackable?
110
+ template "controllers/#{format}/application_controller.rb", "app/controllers/application_controller.rb", force: true
111
+ template "controllers/#{format}/home_controller.rb", "app/controllers/home_controller.rb" unless options.api?
112
+ template "controllers/#{format}/invitations_controller.rb", "app/controllers/invitations_controller.rb" if invitable?
113
+ template "controllers/#{format}/masquerades_controller.rb", "app/controllers/masquerades_controller.rb" if masqueradable?
114
+ template "controllers/#{format}/passwords_controller.rb", "app/controllers/passwords_controller.rb"
115
+ template "controllers/#{format}/registrations_controller.rb", "app/controllers/registrations_controller.rb"
116
+ template "controllers/#{format}/sessions_controller.rb", "app/controllers/sessions_controller.rb"
116
117
  end
117
118
 
118
- def install_javascript_dependencies
119
- return if options.api?
120
-
121
- template "javascript/controllers/application.js", "app/javascript/controllers/application.js", force: true
122
-
123
- if webauthn?
124
- run "bin/importmap pin stimulus-web-authn" if importmaps?
125
- run "yarn add stimulus-web-authn" if node?
126
- end
119
+ def install_javascript
120
+ return unless webauthn?
121
+ copy_file "javascript/controllers/application.js", "app/javascript/controllers/application.js", force: true
122
+ run "bin/importmap pin stimulus-web-authn" if importmaps?
123
+ run "yarn add stimulus-web-authn" if node?
127
124
  end
128
125
 
129
126
  def create_views
@@ -131,37 +128,32 @@ class AuthenticationGenerator < Rails::Generators::Base
131
128
  template "erb/user_mailer/email_verification.html.erb", "app/views/user_mailer/email_verification.html.erb"
132
129
  template "erb/user_mailer/password_reset.html.erb", "app/views/user_mailer/password_reset.html.erb"
133
130
  else
134
- template "erb/user_mailer/email_verification.html.erb", "app/views/user_mailer/email_verification.html.erb"
135
- template "erb/user_mailer/password_reset.html.erb", "app/views/user_mailer/password_reset.html.erb"
136
- template "erb/user_mailer/invitation_instructions.html.erb", "app/views/user_mailer/invitation_instructions.html.erb" if invitable?
137
- template "erb/user_mailer/passwordless.html.erb", "app/views/user_mailer/passwordless.html.erb" if passwordless?
138
-
131
+ directory "erb/authentications/events", "app/views/authentications/events" if options.trackable?
139
132
  directory "erb/home", "app/views/home"
140
-
141
133
  directory "erb/identity", "app/views/identity"
134
+ directory "erb/invitations", "app/views/invitations" if invitable?
142
135
  directory "erb/passwords", "app/views/passwords"
143
136
  directory "erb/registrations", "app/views/registrations"
144
137
 
145
- directory "erb/invitations", "app/views/invitations" if invitable?
146
-
147
- template "erb/sessions/index.html.erb", "app/views/sessions/index.html.erb"
148
- template "erb/sessions/new.html.erb", "app/views/sessions/new.html.erb"
149
-
150
- directory "erb/sessions/sudos", "app/views/sessions/sudos" if sudoable?
151
-
152
138
  directory "erb/sessions/passwordlesses", "app/views/sessions/passwordlesses" if passwordless?
153
-
154
- directory "erb/authentications/events", "app/views/authentications/events" if options.trackable?
139
+ directory "erb/sessions/sudos", "app/views/sessions/sudos" if sudoable?
140
+ template "erb/sessions/index.html.erb", "app/views/sessions/index.html.erb"
141
+ template "erb/sessions/new.html.erb", "app/views/sessions/new.html.erb"
155
142
 
156
143
  if two_factor?
157
- directory "erb/two_factor_authentication/profile/totps", "app/views/two_factor_authentication/profile/totps"
158
- directory "erb/two_factor_authentication/profile/recovery_codes", "app/views/two_factor_authentication/profile/recovery_codes"
159
- directory "erb/two_factor_authentication/profile/security_keys", "app/views/two_factor_authentication/profile/security_keys" if webauthn?
160
-
161
- directory "erb/two_factor_authentication/challenge/totps", "app/views/two_factor_authentication/challenge/totps"
162
144
  directory "erb/two_factor_authentication/challenge/recovery_codes", "app/views/two_factor_authentication/challenge/recovery_codes"
163
145
  directory "erb/two_factor_authentication/challenge/security_keys", "app/views/two_factor_authentication/challenge/security_keys" if webauthn?
146
+ directory "erb/two_factor_authentication/challenge/totps", "app/views/two_factor_authentication/challenge/totps"
147
+
148
+ directory "erb/two_factor_authentication/profile/recovery_codes", "app/views/two_factor_authentication/profile/recovery_codes"
149
+ directory "erb/two_factor_authentication/profile/security_keys", "app/views/two_factor_authentication/profile/security_keys" if webauthn?
150
+ directory "erb/two_factor_authentication/profile/totps", "app/views/two_factor_authentication/profile/totps"
164
151
  end
152
+
153
+ template "erb/user_mailer/email_verification.html.erb", "app/views/user_mailer/email_verification.html.erb"
154
+ template "erb/user_mailer/invitation_instructions.html.erb", "app/views/user_mailer/invitation_instructions.html.erb" if invitable?
155
+ template "erb/user_mailer/password_reset.html.erb", "app/views/user_mailer/password_reset.html.erb"
156
+ template "erb/user_mailer/passwordless.html.erb", "app/views/user_mailer/passwordless.html.erb" if passwordless?
165
157
  end
166
158
  end
167
159
 
@@ -223,7 +215,7 @@ class AuthenticationGenerator < Rails::Generators::Base
223
215
  end
224
216
 
225
217
  def create_test_files
226
- directory "test_unit/controllers/#{format_folder}", "test/controllers"
218
+ directory "test_unit/controllers/#{format}", "test/controllers"
227
219
  directory "test_unit/mailers/", "test/mailers"
228
220
  directory "test_unit/system", "test/system" unless options.api?
229
221
  template "test_unit/test_helper.rb", "test/test_helper.rb", force: true
@@ -231,17 +223,10 @@ class AuthenticationGenerator < Rails::Generators::Base
231
223
  end
232
224
 
233
225
  private
234
- def format_folder
226
+ def format
235
227
  options.api? ? "api" : "html"
236
228
  end
237
229
 
238
- def ratelimit_block
239
- <<~CODE
240
- # Rate limit general requests by IP address in a rate of 1000 requests per minute
241
- config.middleware.use(Rack::Ratelimit, name: "General", rate: [1000, 1.minute], redis: Redis.new, logger: Rails.logger) { |env| ActionDispatch::Request.new(env).ip }
242
- CODE
243
- end
244
-
245
230
  def omniauthable?
246
231
  options.omniauthable? && !options.api?
247
232
  end
@@ -281,4 +266,11 @@ class AuthenticationGenerator < Rails::Generators::Base
281
266
  def node?
282
267
  Rails.root.join("package.json").exist?
283
268
  end
269
+
270
+ def ratelimit_block
271
+ <<~CODE
272
+ # Rate limit general requests by IP address in a rate of 1000 requests per minute
273
+ config.middleware.use(Rack::Ratelimit, name: "General", rate: [1000, 1.minute], redis: Redis.new, logger: Rails.logger) { |env| ActionDispatch::Request.new(env).ip }
274
+ CODE
275
+ end
284
276
  end
@@ -29,9 +29,7 @@
29
29
  </div>
30
30
  <%- end -%>
31
31
  <%- if masqueradable? %>
32
- <div>
33
- <%%= button_to "Signin as last user", user_masquerade_path(User.last) %>
34
- </div>
32
+ <%%= button_to "Signin as last user", user_masquerade_path(User.last) %>
35
33
  <%- end -%>
36
34
 
37
35
  <h2>Access history</h2>
@@ -47,6 +45,4 @@
47
45
 
48
46
  <br>
49
47
 
50
- <div>
51
- <%%= button_to "Log out", Current.session, method: :delete %>
52
- </div>
48
+ <%%= button_to "Log out", Current.session, method: :delete %>
@@ -24,3 +24,9 @@
24
24
  <%%= form.submit "Send an invitation" %>
25
25
  </div>
26
26
  <%% end %>
27
+
28
+ <br>
29
+
30
+ <div>
31
+ <%%= link_to "Back", root_path %>
32
+ </div>
@@ -15,9 +15,7 @@
15
15
 
16
16
  <div>
17
17
  <p><strong>Don't have your phone?</strong></p>
18
- <div>
19
- <%%= link_to "Use a recovery code to access your account.", new_two_factor_authentication_challenge_recovery_codes_path %>
20
- </div>
18
+ <div><%%= link_to "Use a recovery code to access your account.", new_two_factor_authentication_challenge_recovery_codes_path %></div>
21
19
  <%- if webauthn? %>
22
20
  <%% if @user.security_keys.exists? %>
23
21
  <div><%%= link_to "Use a security key to access your account.", new_two_factor_authentication_challenge_security_keys_path %></div>
@@ -5,7 +5,7 @@
5
5
 
6
6
  <ul><%%= render @recovery_codes %></ul>
7
7
 
8
- <%%= link_to "OK, I'm done", root_path %>
8
+ <div><%%= link_to "OK, I'm done", root_path %></div>
9
9
 
10
10
  <hr>
11
11
 
@@ -7,4 +7,12 @@
7
7
 
8
8
  <br>
9
9
 
10
- <%%= link_to "Add security key", new_two_factor_authentication_profile_security_key_path %>
10
+ <div>
11
+ <%%= link_to "Add security key", new_two_factor_authentication_profile_security_key_path %>
12
+ </div>
13
+
14
+ <br>
15
+
16
+ <div>
17
+ <%%= link_to "Back", root_path %>
18
+ </div>
@@ -36,3 +36,9 @@
36
36
  <%%= form.submit "Verify and activate" %>
37
37
  </div>
38
38
  <%% end %>
39
+
40
+ <br>
41
+
42
+ <div>
43
+ <%%= link_to "Back", root_path %>
44
+ </div>
@@ -4,7 +4,7 @@
4
4
 
5
5
  <p><strong>You must hit the link below to confirm that you received this email.</strong></p>
6
6
 
7
- <%%= link_to "Yes, use this email for my account", identity_email_verification_url(sid: @signed_id) %>
7
+ <p><%%= link_to "Yes, use this email for my account", identity_email_verification_url(sid: @signed_id) %></p>
8
8
 
9
9
  <hr>
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <p>You requested a magic sign-in link. Here you go:</p>
4
4
 
5
- <%%= link_to "Sign in without password", edit_sessions_passwordless_url(sid: @signed_id) %>
5
+ <p><%%= link_to "Sign in without password", edit_sessions_passwordless_url(sid: @signed_id) %></p>
6
6
 
7
7
  <hr>
8
8
 
@@ -1,12 +1,8 @@
1
1
  import { Application } from "@hotwired/stimulus"
2
- <%- if webauthn? -%>
3
2
  import WebAuthnController from "stimulus-web-authn"
4
- <%- end -%>
5
3
 
6
4
  const application = Application.start()
7
- <%- if webauthn? -%>
8
5
  application.register("web-authn", WebAuthnController)
9
- <%- end -%>
10
6
 
11
7
  // Configure Stimulus development experience
12
8
  application.debug = false
@@ -2,5 +2,5 @@
2
2
 
3
3
  lazaro_nixon:
4
4
  email: lazaronixon@hotmail.com
5
- password_digest: <%%= BCrypt::Password.create("Secret1*3*5*") %>
5
+ password_digest: <%= BCrypt::Password.create("Secret1*3*5*") %>
6
6
  verified: true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authentication-zero
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.16.25
4
+ version: 2.16.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nixon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-13 00:00:00.000000000 Z
11
+ date: 2023-04-19 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -94,7 +94,7 @@ files:
94
94
  - lib/generators/authentication/templates/erb/user_mailer/invitation_instructions.html.erb.tt
95
95
  - lib/generators/authentication/templates/erb/user_mailer/password_reset.html.erb.tt
96
96
  - lib/generators/authentication/templates/erb/user_mailer/passwordless.html.erb.tt
97
- - lib/generators/authentication/templates/javascript/controllers/application.js.tt
97
+ - lib/generators/authentication/templates/javascript/controllers/application.js
98
98
  - lib/generators/authentication/templates/mailers/user_mailer.rb.tt
99
99
  - lib/generators/authentication/templates/migrations/create_email_verification_tokens_migration.rb.tt
100
100
  - lib/generators/authentication/templates/migrations/create_events_migration.rb.tt
@@ -133,7 +133,7 @@ files:
133
133
  - lib/generators/authentication/templates/test_unit/system/registrations_test.rb.tt
134
134
  - lib/generators/authentication/templates/test_unit/system/sessions_test.rb.tt
135
135
  - lib/generators/authentication/templates/test_unit/test_helper.rb.tt
136
- - lib/generators/authentication/templates/test_unit/users.yml.tt
136
+ - lib/generators/authentication/templates/test_unit/users.yml
137
137
  homepage: https://github.com/lazaronixon/authentication-zero
138
138
  licenses:
139
139
  - MIT