action_auth 1.4.2 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -1
- data/app/assets/stylesheets/action_auth/application.css +75 -0
- data/app/controllers/action_auth/webauthn_credentials_controller.rb +25 -1
- data/app/models/action_auth/webauthn_credential.rb +7 -0
- data/app/views/action_auth/sessions/index.html.erb +2 -0
- data/app/views/action_auth/sessions/passkeys/new.html.erb +1 -1
- data/db/migrate/20240818032321_add_type_to_webauthn_credentials.rb +5 -0
- data/lib/action_auth/configuration.rb +2 -0
- data/lib/action_auth/version.rb +1 -1
- data/lib/tasks/action_auth_tasks.rake +49 -4
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d991a1cd381778da7c3ed0b5ef0878790e81bdd668098eff84937cd4831c0ea
|
4
|
+
data.tar.gz: 82e3f14dc10fc5b67311ef397fd155d92102bab8ef51b6a3494e760f9ff9463d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77dd6d551f7891f62fb2dd10f1fcc17bd6daca8660edf25e232e05b6e2ca6c4ad83b9e4ce73c1f247c2b770d9e4430eb5d681466844ca09a593f77f2c0e79c24
|
7
|
+
data.tar.gz: b6247d918574f799757b41345c234dd8cd78545ff81dd49c57528d7994c62d46adf7c0e9c5e6275c4bbf5eb28be27cba4df5cf5d5e1043256b8b317c59b93e43
|
data/README.md
CHANGED
@@ -61,6 +61,23 @@ add_foreign_key :nfcs, :users, column: :user_id unless foreign_key_exists?(:nfcs
|
|
61
61
|
```
|
62
62
|
|
63
63
|
## Installation
|
64
|
+
|
65
|
+
### Automatic Installation
|
66
|
+
|
67
|
+
Add this line to your application's Gemfile:
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
bundle add action_auth
|
71
|
+
```
|
72
|
+
|
73
|
+
Then run the rake task to copy over the migrations, config and routes.
|
74
|
+
|
75
|
+
```bash
|
76
|
+
bin/rails action_auth:install
|
77
|
+
```
|
78
|
+
|
79
|
+
### Manual Installation
|
80
|
+
|
64
81
|
Add this line to your application's Gemfile:
|
65
82
|
|
66
83
|
```ruby
|
@@ -103,8 +120,9 @@ ActionAuth.configure do |config|
|
|
103
120
|
config.default_from_email = "from@example.com"
|
104
121
|
config.magic_link_enabled = true
|
105
122
|
config.passkey_only = true # Allows sign in with only a passkey
|
123
|
+
config.pwned_enabled = true # defined?(Pwned)
|
106
124
|
config.verify_email_on_sign_in = true
|
107
|
-
config.webauthn_enabled = true
|
125
|
+
config.webauthn_enabled = true # defined?(WebAuthn)
|
108
126
|
config.webauthn_origin = "http://localhost:3000" # or "https://example.com"
|
109
127
|
config.webauthn_rp_name = Rails.application.class.to_s.deconstantize
|
110
128
|
end
|
@@ -171,3 +171,78 @@ input[type="password"] {
|
|
171
171
|
.action-auth--text-center {
|
172
172
|
text-align: center !important;
|
173
173
|
}
|
174
|
+
|
175
|
+
@media (prefers-color-scheme: dark) {
|
176
|
+
body {
|
177
|
+
color: #d5c4a1;
|
178
|
+
background-color: #282828 !important;
|
179
|
+
}
|
180
|
+
|
181
|
+
.container,
|
182
|
+
.container-fluid {
|
183
|
+
background-color: #3c3836 !important;
|
184
|
+
border-color: #3c3836 !important;
|
185
|
+
}
|
186
|
+
|
187
|
+
input[type="text"],
|
188
|
+
input[type="email"],
|
189
|
+
input[type="password"] {
|
190
|
+
color: #d5c4a1;
|
191
|
+
background-color: #282828;
|
192
|
+
border-color: #3c3836;
|
193
|
+
}
|
194
|
+
|
195
|
+
.btn {
|
196
|
+
color: #fbf1c7;
|
197
|
+
background-color: #d65d0e;
|
198
|
+
border-color: #d65d0e;
|
199
|
+
}
|
200
|
+
|
201
|
+
.btn:hover {
|
202
|
+
background-color: #cc241d;
|
203
|
+
border-color: #cc241d;
|
204
|
+
}
|
205
|
+
|
206
|
+
.btn:focus {
|
207
|
+
box-shadow: 0 0 0 0.25rem rgba(214, 93, 14, .5);
|
208
|
+
}
|
209
|
+
|
210
|
+
.btn:disabled {
|
211
|
+
background-color: #d65d0e;
|
212
|
+
border-color: #d65d0e;
|
213
|
+
color: #fbf1c7;
|
214
|
+
}
|
215
|
+
|
216
|
+
.action-auth--table {
|
217
|
+
background-color: #3c3836;
|
218
|
+
color: #d5c4a1;
|
219
|
+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4);
|
220
|
+
}
|
221
|
+
|
222
|
+
.action-auth--table thead {
|
223
|
+
background-color: #d79921;
|
224
|
+
color: #282828;
|
225
|
+
}
|
226
|
+
|
227
|
+
.action-auth--table th,
|
228
|
+
.action-auth--table td {
|
229
|
+
border-bottom: 1px solid #504945;
|
230
|
+
}
|
231
|
+
|
232
|
+
.action-auth--table tbody tr:hover {
|
233
|
+
background-color: #282828;
|
234
|
+
}
|
235
|
+
|
236
|
+
a {
|
237
|
+
color: #83a598;
|
238
|
+
text-decoration: none;
|
239
|
+
}
|
240
|
+
|
241
|
+
a:visited {
|
242
|
+
color: #d3869b;
|
243
|
+
}
|
244
|
+
|
245
|
+
a:hover {
|
246
|
+
color: #fabd2f;
|
247
|
+
}
|
248
|
+
}
|
@@ -38,7 +38,8 @@ class ActionAuth::WebauthnCredentialsController < ApplicationController
|
|
38
38
|
external_id: webauthn_credential.id,
|
39
39
|
nickname: params[:credential_nickname],
|
40
40
|
public_key: webauthn_credential.public_key,
|
41
|
-
sign_count: webauthn_credential.sign_count
|
41
|
+
sign_count: webauthn_credential.sign_count,
|
42
|
+
key_type: key_type
|
42
43
|
)
|
43
44
|
|
44
45
|
if credential.save
|
@@ -57,4 +58,27 @@ class ActionAuth::WebauthnCredentialsController < ApplicationController
|
|
57
58
|
|
58
59
|
redirect_to sessions_path
|
59
60
|
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def key_type
|
65
|
+
transports = params.dig(:response, :transports)
|
66
|
+
return :unknown unless transports.present?
|
67
|
+
|
68
|
+
transport_types = {
|
69
|
+
["internal", "hybrid"] => :passkey,
|
70
|
+
["usb", "nfc"] => :hardware,
|
71
|
+
["bluetooth", "wireless"] => :wireless,
|
72
|
+
}.freeze
|
73
|
+
|
74
|
+
transport_types.each do |keys, type|
|
75
|
+
if transports.is_a?(String)
|
76
|
+
return type if keys.include?(transports)
|
77
|
+
elsif transports.is_a?(Array)
|
78
|
+
return type if (keys & transports).any?
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
:unknown
|
83
|
+
end
|
60
84
|
end
|
@@ -36,6 +36,7 @@
|
|
36
36
|
<thead>
|
37
37
|
<tr>
|
38
38
|
<th>Key</th>
|
39
|
+
<th>Type</th>
|
39
40
|
<th nowrap>Registered On</th>
|
40
41
|
<th nowrap></th>
|
41
42
|
</tr>
|
@@ -44,6 +45,7 @@
|
|
44
45
|
<% current_user.webauthn_credentials.each do |credential| %>
|
45
46
|
<%= content_tag :tr, id: dom_id(credential) do %>
|
46
47
|
<td><%= credential.nickname %></td>
|
48
|
+
<td><%= credential.key_type %></td>
|
47
49
|
<td nowrap><%= credential.created_at.strftime('%B %d, %Y') %></td>
|
48
50
|
<td nowrap><%= button_to "Delete", credential, method: :delete, class: "btn btn-primary" %></td>
|
49
51
|
<% end %>
|
@@ -10,7 +10,7 @@
|
|
10
10
|
class: "action-auth--text-center" do %>
|
11
11
|
|
12
12
|
<div class="mb-3 action-auth--text-center">
|
13
|
-
|
13
|
+
You must use a passkey, not a hardware key, to sign in.
|
14
14
|
An account with a matching passkey is required.
|
15
15
|
</div>
|
16
16
|
<% end %>
|
@@ -4,6 +4,8 @@ module ActionAuth
|
|
4
4
|
attr_accessor :allow_user_deletion
|
5
5
|
attr_accessor :default_from_email
|
6
6
|
attr_accessor :magic_link_enabled
|
7
|
+
attr_accessor :passkey_only
|
8
|
+
attr_accessor :pwned_enabled
|
7
9
|
attr_accessor :verify_email_on_sign_in
|
8
10
|
attr_accessor :webauthn_enabled
|
9
11
|
attr_accessor :webauthn_origin
|
data/lib/action_auth/version.rb
CHANGED
@@ -1,4 +1,49 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
#
|
1
|
+
desc "Installs Configs, Migrations, and Routes for ActionAuth"
|
2
|
+
namespace :action_auth do
|
3
|
+
task :install do
|
4
|
+
# Copies to config/initializers/action_auth.rb
|
5
|
+
puts "Installing ActionAuth Configs"
|
6
|
+
config_file_path = Rails.root.join('config', 'initializers', 'action_auth.rb')
|
7
|
+
unless File.exist?(config_file_path)
|
8
|
+
File.open(config_file_path, 'w') do |file|
|
9
|
+
file.puts <<~RUBY
|
10
|
+
# ActionAuth.configure do |config|
|
11
|
+
# config.allow_user_deletion = true
|
12
|
+
# config.default_from_email = "from@example.com"
|
13
|
+
# config.magic_link_enabled = true
|
14
|
+
# config.passkey_only = true # Allows sign in with only a passkey
|
15
|
+
# config.pwned_enabled = true # defined?(Pwned)
|
16
|
+
# config.verify_email_on_sign_in = true
|
17
|
+
# config.webauthn_enabled = true # defined?(WebAuthn)
|
18
|
+
# config.webauthn_origin = "http://localhost:3000" # or "https://example.com"
|
19
|
+
# config.webauthn_rp_name = Rails.application.class.to_s.deconstantize
|
20
|
+
# end
|
21
|
+
RUBY
|
22
|
+
end
|
23
|
+
puts "Created config/initializers/action_auth.rb"
|
24
|
+
else
|
25
|
+
puts "Config file already exists at config/initializers/action_auth.rb"
|
26
|
+
end
|
27
|
+
|
28
|
+
# Installs the ActionAuth Migrations
|
29
|
+
puts "Installing ActionAuth Migrations"
|
30
|
+
Rake::Task["action_auth:install:migrations"].invoke
|
31
|
+
|
32
|
+
# Add ActionAuth routes to config/routes.rb
|
33
|
+
puts "Installing ActionAuth Routes"
|
34
|
+
routes_file_path = Rails.root.join('config', 'routes.rb')
|
35
|
+
route_line = "mount ActionAuth::Engine => \"/action_auth\""
|
36
|
+
routes_content = File.read(routes_file_path)
|
37
|
+
unless routes_content.include?(route_line)
|
38
|
+
insert_after = "Rails.application.routes.draw do"
|
39
|
+
new_routes_content = routes_content.sub(/(#{insert_after})/i, "\\1\n #{route_line}\n")
|
40
|
+
File.open(routes_file_path, 'w') do |file|
|
41
|
+
file.puts new_routes_content
|
42
|
+
end
|
43
|
+
puts "Added ActionAuth route to config/routes.rb"
|
44
|
+
else
|
45
|
+
puts "ActionAuth route already present in config/routes.rb"
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
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.5.1
|
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-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -98,6 +98,7 @@ files:
|
|
98
98
|
- db/migrate/20231107170349_create_action_auth_sessions.rb
|
99
99
|
- db/migrate/20240111125859_add_webauthn_credentials.rb
|
100
100
|
- db/migrate/20240111142545_add_webauthn_id_to_users.rb
|
101
|
+
- db/migrate/20240818032321_add_type_to_webauthn_credentials.rb
|
101
102
|
- lib/action_auth.rb
|
102
103
|
- lib/action_auth/configuration.rb
|
103
104
|
- lib/action_auth/controllers/helpers.rb
|