action_auth 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +30 -5
- data/app/controllers/action_auth/magics/requests_controller.rb +20 -0
- data/app/controllers/action_auth/magics/sign_ins_controller.rb +15 -0
- data/app/controllers/action_auth/users_controller.rb +10 -0
- data/app/mailers/action_auth/user_mailer.rb +7 -0
- data/app/models/action_auth/user.rb +4 -0
- data/app/views/action_auth/magics/requests/new.html.erb +21 -0
- data/app/views/action_auth/registrations/new.html.erb +3 -0
- data/app/views/action_auth/sessions/new.html.erb +3 -0
- data/app/views/action_auth/user_mailer/magic_link.html.erb +3 -0
- data/config/routes.rb +14 -2
- data/lib/action_auth/configuration.rb +17 -4
- data/lib/action_auth/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2199e638d124811034db20d5d3cd6f0b23d56acf260d42e18f9559bf54405295
|
4
|
+
data.tar.gz: ab312a35ead67087ab41cfb30f54a42696521924fb1e695870e87632742497d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53f6e3b604bc0037a751269cd16975e243e84ebd1018419764c88a2b60a8309455736b2b7a2ec1e6b29cb2970e4e0020348756fed9658400f32d2d3a2f3b179a
|
7
|
+
data.tar.gz: 0ccad04b7a3e4ccbb50e80149b40d452364089600a2a5462ea2392ece13151f8903f65c491d8bd3dc5507ae6fac3ac6430ae18b0b0ac247acb434f898a3c3055
|
data/README.md
CHANGED
@@ -98,11 +98,13 @@ settings.
|
|
98
98
|
|
99
99
|
```ruby
|
100
100
|
ActionAuth.configure do |config|
|
101
|
+
config.allow_user_deletion = true
|
102
|
+
config.default_from_email = "from@example.com"
|
103
|
+
config.magic_link_enabled = true
|
104
|
+
config.verify_email_on_sign_in = true
|
101
105
|
config.webauthn_enabled = true
|
102
106
|
config.webauthn_origin = "http://localhost:3000" # or "https://example.com"
|
103
107
|
config.webauthn_rp_name = Rails.application.class.to_s.deconstantize
|
104
|
-
config.verify_email_on_sign_in = true
|
105
|
-
config.default_from_email = "from@example.com"
|
106
108
|
end
|
107
109
|
```
|
108
110
|
|
@@ -124,11 +126,11 @@ These are the planned features for ActionAuth. The ones that are checked off are
|
|
124
126
|
|
125
127
|
✅ - Passkeys/Hardware Security Keys
|
126
128
|
|
127
|
-
|
129
|
+
✅ - Magic Links
|
128
130
|
|
129
131
|
⏳ - OAuth with Google, Facebook, Github, Twitter, etc.
|
130
132
|
|
131
|
-
|
133
|
+
✅ - Account Deletion
|
132
134
|
|
133
135
|
⏳ - Account Lockout
|
134
136
|
|
@@ -212,6 +214,29 @@ they can add a Passkey to their account. The Passkey could be an iCloud Keychain
|
|
212
214
|
key like a Yubikey, or a mobile device. If enabled and configured, the user will be prompted to use
|
213
215
|
their Passkey after they log in.
|
214
216
|
|
217
|
+
## Magic Links
|
218
|
+
|
219
|
+
Magic Links are a way to authenticate a user without requiring a password. This is done by sending
|
220
|
+
an email to the user with a link that will log them in. This is a great way to allow users to log in
|
221
|
+
without having to remember a password. This is especially useful for users who may not have a password
|
222
|
+
manager or have a hard time remembering passwords.
|
223
|
+
|
224
|
+
## Account Deletion
|
225
|
+
|
226
|
+
Account deletion is a feature that is enabled by default. When a user deletes their account, the account
|
227
|
+
is marked as deleted and the user is logged out. The user will no longer be able to log in with their
|
228
|
+
email and password. The user will need to create a new account if they wish to continue using the application.
|
229
|
+
|
230
|
+
Here's an example of how you may want to add a delete account button to your application. Obviously, you
|
231
|
+
will want to style this to fit your application and have some kind of confirmation dialog.
|
232
|
+
|
233
|
+
```
|
234
|
+
<p>
|
235
|
+
Unhappy with the service?
|
236
|
+
<%= button_to "Delete Account", action_auth.users_path, method: :delete %>
|
237
|
+
</p>
|
238
|
+
```
|
239
|
+
|
215
240
|
#### Configuration
|
216
241
|
|
217
242
|
The migrations are already copied over to your application when you run
|
@@ -272,7 +297,7 @@ We can set the user to become a User record instead of an ActionAuth::User recor
|
|
272
297
|
class Current < ActiveSupport::CurrentAttributes
|
273
298
|
def user
|
274
299
|
return unless ActionAuth::Current.user
|
275
|
-
ActionAuth::Current.user
|
300
|
+
ActionAuth::Current.user&.becomes(User)
|
276
301
|
end
|
277
302
|
end
|
278
303
|
```
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ActionAuth
|
2
|
+
class Magics::RequestsController < ApplicationController
|
3
|
+
def new
|
4
|
+
end
|
5
|
+
|
6
|
+
def create
|
7
|
+
user = User.find_or_initialize_by(email: params[:email])
|
8
|
+
if user.new_record?
|
9
|
+
password = SecureRandom.hex(32)
|
10
|
+
user.password = password
|
11
|
+
user.password_confirmation = password
|
12
|
+
user.save!
|
13
|
+
end
|
14
|
+
|
15
|
+
UserMailer.with(user: user).magic_link.deliver_later
|
16
|
+
|
17
|
+
redirect_to sign_in_path, notice: "Check your email for a magic link."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ActionAuth
|
2
|
+
class Magics::SignInsController < ApplicationController
|
3
|
+
def show
|
4
|
+
user = ActionAuth::User.find_by_token_for(:magic_token, params[:token])
|
5
|
+
if user
|
6
|
+
@session = user.sessions.create
|
7
|
+
cookies.signed.permanent[:session_token] = { value: @session.id, httponly: true }
|
8
|
+
user.update(verified: true)
|
9
|
+
redirect_to main_app.root_path, notice: "Signed In"
|
10
|
+
else
|
11
|
+
redirect_to sign_in_path, alert: "Authentication failed, please try again."
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -13,5 +13,12 @@ module ActionAuth
|
|
13
13
|
|
14
14
|
mail to: @user.email, subject: "Verify your email"
|
15
15
|
end
|
16
|
+
|
17
|
+
def magic_link
|
18
|
+
@user = params[:user]
|
19
|
+
@signed_id = @user.generate_token_for(:magic_token)
|
20
|
+
|
21
|
+
mail to: @user.email, subject: "Sign in to your account"
|
22
|
+
end
|
16
23
|
end
|
17
24
|
end
|
@@ -20,6 +20,10 @@ module ActionAuth
|
|
20
20
|
password_salt.last(10)
|
21
21
|
end
|
22
22
|
|
23
|
+
generates_token_for :magic_token, expires_in: 20.minutes do
|
24
|
+
password_salt.last(10)
|
25
|
+
end
|
26
|
+
|
23
27
|
validates :email, presence: true, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }
|
24
28
|
validates :password, allow_nil: true, length: { minimum: 12 }
|
25
29
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<h1>Sign up</h1>
|
2
|
+
|
3
|
+
<%= form_with(url: magics_requests_path) do |form| %>
|
4
|
+
<div class="mb-3">
|
5
|
+
<%= form.label :email, style: "display: block" %>
|
6
|
+
<%= form.email_field :email, required: true, autofocus: true, autocomplete: "email" %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="mb-3">
|
10
|
+
<%= form.submit "Request Magic Link", class: "btn btn-primary" %>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<div class="mb-3">
|
15
|
+
<%= link_to "Sign In", sign_in_path %> |
|
16
|
+
<%= link_to "Sign Up", sign_up_path %> |
|
17
|
+
<%= link_to "Reset Password", new_identity_password_reset_path %>
|
18
|
+
<% if ActionAuth.configuration.verify_email_on_sign_in %>
|
19
|
+
| <%= link_to "Verify Email", identity_email_verification_path %>
|
20
|
+
<% end %>
|
21
|
+
</div>
|
@@ -36,6 +36,9 @@
|
|
36
36
|
|
37
37
|
<div class="mb-3">
|
38
38
|
<%= link_to "Sign In", sign_in_path %> |
|
39
|
+
<% if ActionAuth.configuration.magic_link_enabled? %>
|
40
|
+
<%= link_to "Magic Link", new_magics_requests_path %> |
|
41
|
+
<% end %>
|
39
42
|
<%= link_to "Reset Password", new_identity_password_reset_path %>
|
40
43
|
<% if ActionAuth.configuration.verify_email_on_sign_in %>
|
41
44
|
| <%= link_to "Verify Email", identity_email_verification_path %>
|
@@ -21,6 +21,9 @@
|
|
21
21
|
|
22
22
|
<div class="mb-3">
|
23
23
|
<%= link_to "Sign Up", sign_up_path %> |
|
24
|
+
<% if ActionAuth.configuration.magic_link_enabled? %>
|
25
|
+
<%= link_to "Magic Link", new_magics_requests_path %> |
|
26
|
+
<% end %>
|
24
27
|
<%= link_to "Reset Password", new_identity_password_reset_path %>
|
25
28
|
<% if ActionAuth.configuration.verify_email_on_sign_in %>
|
26
29
|
| <%= link_to "Verify Email", identity_email_verification_path %>
|
data/config/routes.rb
CHANGED
@@ -3,13 +3,18 @@ ActionAuth::Engine.routes.draw do
|
|
3
3
|
post "sign_in", to: "sessions#create"
|
4
4
|
get "sign_up", to: "registrations#new"
|
5
5
|
post "sign_up", to: "registrations#create"
|
6
|
-
|
7
|
-
resource :password, only: [:edit, :update]
|
6
|
+
|
8
7
|
namespace :identity do
|
9
8
|
resource :email, only: [:edit, :update]
|
10
9
|
resource :email_verification, only: [:show, :create]
|
11
10
|
resource :password_reset, only: [:new, :edit, :create, :update]
|
12
11
|
end
|
12
|
+
resource :password, only: [:edit, :update]
|
13
|
+
resources :sessions, only: [:index, :show, :destroy]
|
14
|
+
|
15
|
+
if ActionAuth.configuration.allow_user_deletion?
|
16
|
+
resource :users, only: [:destroy]
|
17
|
+
end
|
13
18
|
|
14
19
|
if ActionAuth.configuration.webauthn_enabled?
|
15
20
|
resources :webauthn_credentials, only: [:new, :create, :destroy] do
|
@@ -18,4 +23,11 @@ ActionAuth::Engine.routes.draw do
|
|
18
23
|
|
19
24
|
resource :webauthn_credential_authentications, only: [:new, :create]
|
20
25
|
end
|
26
|
+
|
27
|
+
if ActionAuth.configuration.magic_link_enabled?
|
28
|
+
namespace :magics do
|
29
|
+
resource :sign_ins, only: [:show]
|
30
|
+
resource :requests, only: [:new, :create]
|
31
|
+
end
|
32
|
+
end
|
21
33
|
end
|
@@ -1,18 +1,31 @@
|
|
1
1
|
module ActionAuth
|
2
2
|
class Configuration
|
3
3
|
|
4
|
+
attr_accessor :allow_user_deletion
|
5
|
+
attr_accessor :default_from_email
|
6
|
+
attr_accessor :magic_link_enabled
|
7
|
+
attr_accessor :verify_email_on_sign_in
|
4
8
|
attr_accessor :webauthn_enabled
|
5
9
|
attr_accessor :webauthn_origin
|
6
10
|
attr_accessor :webauthn_rp_name
|
7
|
-
|
8
|
-
attr_accessor :default_from_email
|
11
|
+
|
9
12
|
|
10
13
|
def initialize
|
14
|
+
@allow_user_deletion = true
|
15
|
+
@default_from_email = "from@example.com"
|
16
|
+
@magic_link_enabled = true
|
17
|
+
@verify_email_on_sign_in = true
|
11
18
|
@webauthn_enabled = defined?(WebAuthn)
|
12
19
|
@webauthn_origin = "http://localhost:3000"
|
13
20
|
@webauthn_rp_name = Rails.application.class.to_s.deconstantize
|
14
|
-
|
15
|
-
|
21
|
+
end
|
22
|
+
|
23
|
+
def allow_user_deletion?
|
24
|
+
@allow_user_deletion.respond_to?(:call) ? @allow_user_deletion.call : @allow_user_deletion
|
25
|
+
end
|
26
|
+
|
27
|
+
def magic_link_enabled?
|
28
|
+
@magic_link_enabled.respond_to?(:call) ? @magic_link_enabled.call : @magic_link_enabled
|
16
29
|
end
|
17
30
|
|
18
31
|
def webauthn_enabled?
|
data/lib/action_auth/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: action_auth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Kimura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-08-
|
11
|
+
date: 2024-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -56,9 +56,12 @@ files:
|
|
56
56
|
- app/controllers/action_auth/identity/email_verifications_controller.rb
|
57
57
|
- app/controllers/action_auth/identity/emails_controller.rb
|
58
58
|
- app/controllers/action_auth/identity/password_resets_controller.rb
|
59
|
+
- app/controllers/action_auth/magics/requests_controller.rb
|
60
|
+
- app/controllers/action_auth/magics/sign_ins_controller.rb
|
59
61
|
- app/controllers/action_auth/passwords_controller.rb
|
60
62
|
- app/controllers/action_auth/registrations_controller.rb
|
61
63
|
- app/controllers/action_auth/sessions_controller.rb
|
64
|
+
- app/controllers/action_auth/users_controller.rb
|
62
65
|
- app/controllers/action_auth/webauthn_credential_authentications_controller.rb
|
63
66
|
- app/controllers/action_auth/webauthn_credentials_controller.rb
|
64
67
|
- app/helpers/action_auth/application_helper.rb
|
@@ -73,12 +76,14 @@ files:
|
|
73
76
|
- app/views/action_auth/identity/emails/edit.html.erb
|
74
77
|
- app/views/action_auth/identity/password_resets/edit.html.erb
|
75
78
|
- app/views/action_auth/identity/password_resets/new.html.erb
|
79
|
+
- app/views/action_auth/magics/requests/new.html.erb
|
76
80
|
- app/views/action_auth/passwords/edit.html.erb
|
77
81
|
- app/views/action_auth/registrations/new.html.erb
|
78
82
|
- app/views/action_auth/sessions/index.html.erb
|
79
83
|
- app/views/action_auth/sessions/new.html.erb
|
80
84
|
- app/views/action_auth/user_mailer/email_verification.html.erb
|
81
85
|
- app/views/action_auth/user_mailer/email_verification.text.erb
|
86
|
+
- app/views/action_auth/user_mailer/magic_link.html.erb
|
82
87
|
- app/views/action_auth/user_mailer/password_reset.html.erb
|
83
88
|
- app/views/action_auth/user_mailer/password_reset.text.erb
|
84
89
|
- app/views/action_auth/webauthn_credential_authentications/new.html.erb
|