authentication-zero 3.0.2 → 4.0.3
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/.github/workflows/CI.yml +2 -3
- data/CHANGELOG.md +24 -0
- data/Gemfile.lock +1 -1
- data/README.md +6 -1
- data/lib/authentication_zero/version.rb +1 -1
- data/lib/generators/authentication/authentication_generator.rb +10 -32
- data/lib/generators/authentication/templates/controllers/api/application_controller.rb.tt +0 -10
- data/lib/generators/authentication/templates/controllers/api/identity/password_resets_controller.rb.tt +0 -3
- data/lib/generators/authentication/templates/controllers/html/application_controller.rb.tt +3 -10
- data/lib/generators/authentication/templates/controllers/html/identity/password_resets_controller.rb.tt +1 -1
- data/lib/generators/authentication/templates/controllers/html/sessions/passwordlesses_controller.rb.tt +1 -1
- data/lib/generators/authentication/templates/controllers/html/sessions/sudos_controller.rb.tt +1 -1
- data/lib/generators/authentication/templates/javascript/controllers/web_authn_controller.js +111 -0
- data/lib/generators/authentication/templates/migrations/create_sessions_migration.rb.tt +3 -0
- data/lib/generators/authentication/templates/models/session.rb.tt +9 -6
- data/lib/generators/authentication/templates/models/user.rb.tt +1 -0
- metadata +4 -11
- data/lib/generators/authentication/templates/config/redis/shared.yml +0 -10
- data/lib/generators/authentication/templates/javascript/controllers/application.js +0 -11
- data/lib/generators/authentication/templates/test_unit/application_system_test_case.rb.tt +0 -15
- data/lib/generators/authentication/templates/test_unit/system/identity/emails_test.rb.tt +0 -26
- data/lib/generators/authentication/templates/test_unit/system/identity/password_resets_test.rb.tt +0 -28
- data/lib/generators/authentication/templates/test_unit/system/passwords_test.rb.tt +0 -18
- data/lib/generators/authentication/templates/test_unit/system/registrations_test.rb.tt +0 -14
- data/lib/generators/authentication/templates/test_unit/system/sessions_test.rb.tt +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a20860b4e4e996ed12ee1f8627c322cee71785051bb58569e8d3694bd8d46860
|
4
|
+
data.tar.gz: da8ceac9a2cd8d53028b446fd988b9604bbc6a72ab8f89dfe4cc0442cd0facd7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03ba76dae5a7ae6862a45525d43bcbf1ca566b5e5bd1738a743f52a62d5af8c31838381e183d3eb2fd2776a7f909430c6a57746999c9bd4f4ead57bd67ccf6a1
|
7
|
+
data.tar.gz: 1d8aad9fc172635ba87cc4f154a25a1da38470967cd8a8e82f344318bf54e95e5a759f0956b38a48092d08ae29d6a626750d6076c45f40f84d96918db5c54f75
|
data/.github/workflows/CI.yml
CHANGED
@@ -22,7 +22,7 @@ jobs:
|
|
22
22
|
bundler-cache: true
|
23
23
|
|
24
24
|
- name: Install the latest Rails gem
|
25
|
-
run: gem install rails -v "7.1
|
25
|
+
run: gem install rails -v "7.2.1"
|
26
26
|
|
27
27
|
- name: Install Rubocop
|
28
28
|
run: gem install rubocop rubocop-performance rubocop-minitest rubocop-packaging rubocop-minitest rubocop-rails
|
@@ -50,7 +50,6 @@ jobs:
|
|
50
50
|
run: |
|
51
51
|
cd test-app
|
52
52
|
bin/rails test
|
53
|
-
bin/rails test:system
|
54
53
|
|
55
54
|
test_api:
|
56
55
|
name: 🧪 Run API Tests
|
@@ -66,7 +65,7 @@ jobs:
|
|
66
65
|
bundler-cache: true
|
67
66
|
|
68
67
|
- name: Install the latest Rails gem
|
69
|
-
run: gem install rails -v "7.1
|
68
|
+
run: gem install rails -v "7.2.1"
|
70
69
|
|
71
70
|
- name: Install Rubocop
|
72
71
|
run: gem install rubocop rubocop-performance rubocop-minitest rubocop-packaging rubocop-minitest rubocop-rails
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
## New version
|
2
|
+
|
3
|
+
## Authentication Zero 4.0.3 ##
|
4
|
+
|
5
|
+
* We don't need to add `config.action_mailer.default_url_options` anymore
|
6
|
+
* Make gem add bcrypt more resilient
|
7
|
+
|
8
|
+
## Authentication Zero 4.0.2 ##
|
9
|
+
|
10
|
+
* Remove dependency on redis / kredis for sudoable
|
11
|
+
* Fix --webauthn option. (add @github/webauthn-json)
|
12
|
+
* Update application_controller to rails 8
|
13
|
+
* Remove --ratelimit option
|
14
|
+
|
15
|
+
## Authentication Zero 4.0.1 ##
|
16
|
+
|
17
|
+
* Remove rate limit from api generator
|
18
|
+
|
19
|
+
## Authentication Zero 4.0.0 ##
|
20
|
+
|
21
|
+
* Remove system tests
|
22
|
+
* Use native rate_limit for lockable
|
23
|
+
* Copy web_authn_controller.js instead of depend on stimulus-web-authn
|
24
|
+
|
1
25
|
## Authentication Zero 3.0.2 ##
|
2
26
|
|
3
27
|
* Fix bug where token is not expired/invalid
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -8,6 +8,12 @@ The purpose of authentication zero is to generate a pre-built authentication sys
|
|
8
8
|
$ bundle add authentication-zero
|
9
9
|
```
|
10
10
|
|
11
|
+
If you are using Rails < 7.2, you must use version 3.
|
12
|
+
|
13
|
+
```
|
14
|
+
$ bundle add authentication-zero --version "~> 3"
|
15
|
+
```
|
16
|
+
|
11
17
|
If you are using Rails < 7.1, you must use version 2.
|
12
18
|
|
13
19
|
```
|
@@ -40,7 +46,6 @@ Since Authentication Zero generates this code into your application instead of b
|
|
40
46
|
- Reset the user password and send reset instructions
|
41
47
|
- Reset the user password only from verified emails
|
42
48
|
- Lock mechanism to prevent email bombing (--lockable)
|
43
|
-
- Rate limiting for your app, 1000 reqs/minute (--ratelimit)
|
44
49
|
- Send e-mail confirmation when your email has been changed
|
45
50
|
- Manage multiple sessions & devices
|
46
51
|
- Activity log (--trackable)
|
@@ -7,8 +7,7 @@ class AuthenticationGenerator < Rails::Generators::Base
|
|
7
7
|
class_option :pwned, type: :boolean, desc: "Add pwned password validation"
|
8
8
|
class_option :sudoable, type: :boolean, desc: "Add password request before sensitive data changes"
|
9
9
|
class_option :lockable, type: :boolean, desc: "Add password reset locking"
|
10
|
-
class_option :
|
11
|
-
class_option :passwordless, type: :boolean, desc: "Add passwordless sign"
|
10
|
+
class_option :passwordless, type: :boolean, desc: "Add passwordless sign in"
|
12
11
|
class_option :omniauthable, type: :boolean, desc: "Add social login support"
|
13
12
|
class_option :trackable, type: :boolean, desc: "Add activity log support"
|
14
13
|
class_option :two_factor, type: :boolean, desc: "Add two factor authentication"
|
@@ -20,15 +19,10 @@ class AuthenticationGenerator < Rails::Generators::Base
|
|
20
19
|
source_root File.expand_path("templates", __dir__)
|
21
20
|
|
22
21
|
def add_gems
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
gem "
|
27
|
-
end
|
28
|
-
|
29
|
-
if redis?
|
30
|
-
gem "redis", "~> 4.0", comment: "Use Redis adapter to run additional authentication features"
|
31
|
-
gem "kredis", comment: "Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis]"
|
22
|
+
if bcrypt_present?
|
23
|
+
uncomment_lines "Gemfile", /gem "bcrypt"/
|
24
|
+
else
|
25
|
+
gem "bcrypt", "~> 3.1.7", comment: "Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword]"
|
32
26
|
end
|
33
27
|
|
34
28
|
if options.pwned?
|
@@ -50,14 +44,7 @@ class AuthenticationGenerator < Rails::Generators::Base
|
|
50
44
|
end
|
51
45
|
end
|
52
46
|
|
53
|
-
def add_environment_configurations
|
54
|
-
application "config.action_mailer.default_url_options = { host: \"localhost\", port: 3000 }", env: "development"
|
55
|
-
application "config.action_mailer.default_url_options = { host: \"localhost\", port: 3000 }", env: "test"
|
56
|
-
environment ratelimit_block, env: "production" if options.ratelimit?
|
57
|
-
end
|
58
|
-
|
59
47
|
def create_configuration_files
|
60
|
-
copy_file "config/redis/shared.yml" if redis?
|
61
48
|
copy_file "config/initializers/omniauth.rb" if omniauthable?
|
62
49
|
copy_file "config/initializers/webauthn.rb" if webauthn?
|
63
50
|
end
|
@@ -123,9 +110,9 @@ class AuthenticationGenerator < Rails::Generators::Base
|
|
123
110
|
|
124
111
|
def install_javascript
|
125
112
|
return unless webauthn?
|
126
|
-
copy_file "javascript/controllers/
|
127
|
-
run "bin/importmap pin
|
128
|
-
run "yarn add
|
113
|
+
copy_file "javascript/controllers/web_authn_controller.js", "app/javascript/controllers/web_authn_controller.js"
|
114
|
+
run "bin/importmap pin @rails/request.js @github/webauthn-json" if importmaps?
|
115
|
+
run "yarn add @rails/request.js @github/webauthn-json" if node?
|
129
116
|
end
|
130
117
|
|
131
118
|
def create_views
|
@@ -222,9 +209,7 @@ class AuthenticationGenerator < Rails::Generators::Base
|
|
222
209
|
def create_test_files
|
223
210
|
directory "test_unit/controllers/#{format}", "test/controllers"
|
224
211
|
directory "test_unit/mailers/", "test/mailers"
|
225
|
-
directory "test_unit/system", "test/system" unless options.api?
|
226
212
|
template "test_unit/test_helper.rb", "test/test_helper.rb", force: true
|
227
|
-
template "test_unit/application_system_test_case.rb", "test/application_system_test_case.rb", force: true unless options.api?
|
228
213
|
end
|
229
214
|
|
230
215
|
private
|
@@ -260,8 +245,8 @@ class AuthenticationGenerator < Rails::Generators::Base
|
|
260
245
|
options.sudoable? && !options.api?
|
261
246
|
end
|
262
247
|
|
263
|
-
def
|
264
|
-
|
248
|
+
def bcrypt_present?
|
249
|
+
File.read("Gemfile").include?('gem "bcrypt"')
|
265
250
|
end
|
266
251
|
|
267
252
|
def importmaps?
|
@@ -271,11 +256,4 @@ class AuthenticationGenerator < Rails::Generators::Base
|
|
271
256
|
def node?
|
272
257
|
Rails.root.join("package.json").exist?
|
273
258
|
end
|
274
|
-
|
275
|
-
def ratelimit_block
|
276
|
-
<<~CODE
|
277
|
-
# Rate limit general requests by IP address in a rate of 1000 requests per minute
|
278
|
-
config.middleware.use(Rack::Ratelimit, name: "General", rate: [1000, 1.minute], redis: Redis.new, logger: Rails.logger) { |env| ActionDispatch::Request.new(env).ip }
|
279
|
-
CODE
|
280
|
-
end
|
281
259
|
end
|
@@ -17,14 +17,4 @@ class ApplicationController < ActionController::API
|
|
17
17
|
Current.user_agent = request.user_agent
|
18
18
|
Current.ip_address = request.ip
|
19
19
|
end
|
20
|
-
<%- if options.lockable? %>
|
21
|
-
def require_lock(wait: 1.hour, attempts: 10)
|
22
|
-
counter = Kredis.counter("require_lock:#{request.remote_ip}:#{controller_path}:#{action_name}", expires_in: wait)
|
23
|
-
counter.increment
|
24
|
-
|
25
|
-
if counter.value > attempts
|
26
|
-
render json: { error: "You've exceeded the maximum number of attempts" }, status: :too_many_requests
|
27
|
-
end
|
28
|
-
end
|
29
|
-
<%- end -%>
|
30
20
|
end
|
@@ -1,4 +1,7 @@
|
|
1
1
|
class ApplicationController < ActionController::Base
|
2
|
+
# Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
|
3
|
+
allow_browser versions: :modern
|
4
|
+
|
2
5
|
before_action :set_current_request_details
|
3
6
|
before_action :authenticate
|
4
7
|
|
@@ -15,16 +18,6 @@ class ApplicationController < ActionController::Base
|
|
15
18
|
Current.user_agent = request.user_agent
|
16
19
|
Current.ip_address = request.ip
|
17
20
|
end
|
18
|
-
<%- if options.lockable? %>
|
19
|
-
def require_lock(wait: 1.hour, attempts: 10)
|
20
|
-
counter = Kredis.counter("require_lock:#{request.remote_ip}:#{controller_path}:#{action_name}", expires_in: wait)
|
21
|
-
counter.increment
|
22
|
-
|
23
|
-
if counter.value > attempts
|
24
|
-
redirect_to root_path, alert: "You've exceeded the maximum number of attempts"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
<%- end -%>
|
28
21
|
<%- if sudoable? %>
|
29
22
|
def require_sudo
|
30
23
|
unless Current.session.sudo?
|
@@ -2,7 +2,7 @@ class Identity::PasswordResetsController < ApplicationController
|
|
2
2
|
skip_before_action :authenticate
|
3
3
|
|
4
4
|
<%- if options.lockable? -%>
|
5
|
-
|
5
|
+
rate_limit to: 10, within: 1.hour, only: :create, with: -> { redirect_to root_path, alert: "Try again later" }
|
6
6
|
<%- end -%>
|
7
7
|
before_action :set_user, only: %i[ edit update ]
|
8
8
|
|
@@ -2,7 +2,7 @@ class Sessions::PasswordlessesController < ApplicationController
|
|
2
2
|
skip_before_action :authenticate
|
3
3
|
|
4
4
|
<%- if options.lockable? -%>
|
5
|
-
|
5
|
+
rate_limit to: 10, within: 1.hour, only: :create, with: -> { redirect_to root_path, alert: "Try again later" }
|
6
6
|
<%- end -%>
|
7
7
|
before_action :set_user, only: :edit
|
8
8
|
|
data/lib/generators/authentication/templates/controllers/html/sessions/sudos_controller.rb.tt
CHANGED
@@ -6,7 +6,7 @@ class Sessions::SudosController < ApplicationController
|
|
6
6
|
session_record = Current.session
|
7
7
|
|
8
8
|
if session_record.user.authenticate(params[:password])
|
9
|
-
session_record.
|
9
|
+
session_record.touch(:sudo_at); redirect_to(params[:proceed_to_url])
|
10
10
|
else
|
11
11
|
redirect_to new_sessions_sudo_path(proceed_to_url: params[:proceed_to_url]), alert: "The password you entered is incorrect"
|
12
12
|
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
import { Controller } from "@hotwired/stimulus"
|
2
|
+
import { create, get, supported } from "@github/webauthn-json"
|
3
|
+
import { FetchRequest } from "@rails/request.js"
|
4
|
+
|
5
|
+
export default class WebAuthnController extends Controller {
|
6
|
+
static targets = [ "error", "button", "supportText" ]
|
7
|
+
static classes = [ "loading" ]
|
8
|
+
static values = {
|
9
|
+
challengeUrl: String,
|
10
|
+
verificationUrl: String,
|
11
|
+
fallbackUrl: String,
|
12
|
+
retryText: { type: String, default: "Retry" },
|
13
|
+
notAllowedText: { type: String, default: "That didn't work. Either it was cancelled or took too long. Please try again." },
|
14
|
+
invalidStateText: { type: String, default: "We couldn't add that security key. Please confirm you haven't already registered it, then try again." }
|
15
|
+
}
|
16
|
+
|
17
|
+
connect() {
|
18
|
+
if (!supported()) {
|
19
|
+
this.handleUnsupportedBrowser()
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
getCredential() {
|
24
|
+
this.hideError()
|
25
|
+
this.disableForm()
|
26
|
+
this.requestChallengeAndVerify(get)
|
27
|
+
}
|
28
|
+
|
29
|
+
createCredential() {
|
30
|
+
this.hideError()
|
31
|
+
this.disableForm()
|
32
|
+
this.requestChallengeAndVerify(create)
|
33
|
+
}
|
34
|
+
|
35
|
+
// Private
|
36
|
+
|
37
|
+
handleUnsupportedBrowser() {
|
38
|
+
this.buttonTarget.parentNode.removeChild(this.buttonTarget)
|
39
|
+
|
40
|
+
if (this.fallbackUrlValue) {
|
41
|
+
window.location.replace(this.fallbackUrlValue)
|
42
|
+
} else {
|
43
|
+
this.supportTextTargets.forEach(target => target.hidden = !target.hidden)
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
async requestChallengeAndVerify(fn) {
|
48
|
+
try {
|
49
|
+
const challengeResponse = await this.requestPublicKeyChallenge()
|
50
|
+
const credentialResponse = await fn({ publicKey: challengeResponse })
|
51
|
+
this.onCompletion(await this.verify(credentialResponse))
|
52
|
+
} catch (error) {
|
53
|
+
this.onError(error)
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
async requestPublicKeyChallenge() {
|
58
|
+
return await this.request("get", this.challengeUrlValue)
|
59
|
+
}
|
60
|
+
|
61
|
+
async verify(credentialResponse) {
|
62
|
+
return await this.request("post", this.verificationUrlValue, {
|
63
|
+
body: JSON.stringify({ credential: credentialResponse }),
|
64
|
+
contentType: "application/json",
|
65
|
+
responseKind: "json"
|
66
|
+
})
|
67
|
+
}
|
68
|
+
|
69
|
+
onCompletion(response) {
|
70
|
+
window.location.replace(response.location)
|
71
|
+
}
|
72
|
+
|
73
|
+
onError(error) {
|
74
|
+
if (error.code === 0 && error.name === "NotAllowedError") {
|
75
|
+
this.errorTarget.textContent = this.notAllowedTextValue
|
76
|
+
} else if (error.code === 11 && error.name === "InvalidStateError") {
|
77
|
+
this.errorTarget.textContent = this.invalidStateTextValue
|
78
|
+
} else {
|
79
|
+
this.errorTarget.textContent = error.message
|
80
|
+
}
|
81
|
+
this.showError()
|
82
|
+
}
|
83
|
+
|
84
|
+
hideError() {
|
85
|
+
if (this.hasErrorTarget) this.errorTarget.hidden = true
|
86
|
+
}
|
87
|
+
|
88
|
+
showError() {
|
89
|
+
if (this.hasErrorTarget) {
|
90
|
+
this.errorTarget.hidden = false
|
91
|
+
this.buttonTarget.textContent = this.retryTextValue
|
92
|
+
this.enableForm()
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
enableForm() {
|
97
|
+
this.element.classList.remove(this.loadingClass)
|
98
|
+
this.buttonTarget.disabled = false
|
99
|
+
}
|
100
|
+
|
101
|
+
disableForm() {
|
102
|
+
this.element.classList.add(this.loadingClass)
|
103
|
+
this.buttonTarget.disabled = true
|
104
|
+
}
|
105
|
+
|
106
|
+
async request(method, url, options) {
|
107
|
+
const request = new FetchRequest(method, url, { responseKind: "json", ...options })
|
108
|
+
const response = await request.perform()
|
109
|
+
return response.json
|
110
|
+
}
|
111
|
+
}
|
@@ -4,6 +4,9 @@ class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Mi
|
|
4
4
|
t.references :user, null: false, foreign_key: true
|
5
5
|
t.string :user_agent
|
6
6
|
t.string :ip_address
|
7
|
+
<%- if sudoable? %>
|
8
|
+
t.datetime :sudo_at, null: false
|
9
|
+
<%- end -%>
|
7
10
|
|
8
11
|
t.timestamps
|
9
12
|
end
|
@@ -1,18 +1,21 @@
|
|
1
1
|
class Session < ApplicationRecord
|
2
2
|
belongs_to :user
|
3
|
-
<%- if sudoable? %>
|
4
|
-
kredis_flag :sudo, expires_in: 30.minutes
|
5
|
-
<%- end -%>
|
6
3
|
|
7
4
|
before_create do
|
8
5
|
self.user_agent = Current.user_agent
|
9
6
|
self.ip_address = Current.ip_address
|
7
|
+
<%- if sudoable? %>
|
8
|
+
self.sudo_at = Time.current
|
9
|
+
<%- end -%>
|
10
10
|
end
|
11
|
-
<%- if sudoable? %>
|
12
|
-
after_create { sudo.mark }
|
13
|
-
<%- end -%>
|
14
11
|
<%- if options.trackable? %>
|
15
12
|
after_create { user.events.create! action: "signed_in" }
|
16
13
|
after_destroy { user.events.create! action: "signed_out" }
|
17
14
|
<%- end -%>
|
15
|
+
<%- if sudoable? %>
|
16
|
+
|
17
|
+
def sudo?
|
18
|
+
sudo_at > 30.minutes.ago
|
19
|
+
end
|
20
|
+
<%- end -%>
|
18
21
|
end
|
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:
|
4
|
+
version: 4.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nixon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -37,7 +37,6 @@ files:
|
|
37
37
|
- lib/generators/authentication/authentication_generator.rb
|
38
38
|
- lib/generators/authentication/templates/config/initializers/omniauth.rb
|
39
39
|
- lib/generators/authentication/templates/config/initializers/webauthn.rb
|
40
|
-
- lib/generators/authentication/templates/config/redis/shared.yml
|
41
40
|
- lib/generators/authentication/templates/controllers/api/application_controller.rb.tt
|
42
41
|
- lib/generators/authentication/templates/controllers/api/authentications/events_controller.rb.tt
|
43
42
|
- lib/generators/authentication/templates/controllers/api/identity/email_verifications_controller.rb.tt
|
@@ -94,7 +93,7 @@ files:
|
|
94
93
|
- lib/generators/authentication/templates/erb/user_mailer/invitation_instructions.html.erb.tt
|
95
94
|
- lib/generators/authentication/templates/erb/user_mailer/password_reset.html.erb.tt
|
96
95
|
- lib/generators/authentication/templates/erb/user_mailer/passwordless.html.erb.tt
|
97
|
-
- lib/generators/authentication/templates/javascript/controllers/
|
96
|
+
- lib/generators/authentication/templates/javascript/controllers/web_authn_controller.js
|
98
97
|
- lib/generators/authentication/templates/lib/account_middleware.rb
|
99
98
|
- lib/generators/authentication/templates/mailers/user_mailer.rb.tt
|
100
99
|
- lib/generators/authentication/templates/migrations/create_accounts_migration.rb.tt
|
@@ -113,7 +112,6 @@ files:
|
|
113
112
|
- lib/generators/authentication/templates/models/session.rb.tt
|
114
113
|
- lib/generators/authentication/templates/models/sign_in_token.rb.tt
|
115
114
|
- lib/generators/authentication/templates/models/user.rb.tt
|
116
|
-
- lib/generators/authentication/templates/test_unit/application_system_test_case.rb.tt
|
117
115
|
- lib/generators/authentication/templates/test_unit/controllers/api/identity/email_verifications_controller_test.rb.tt
|
118
116
|
- lib/generators/authentication/templates/test_unit/controllers/api/identity/emails_controller_test.rb.tt
|
119
117
|
- lib/generators/authentication/templates/test_unit/controllers/api/identity/password_resets_controller_test.rb.tt
|
@@ -127,11 +125,6 @@ files:
|
|
127
125
|
- lib/generators/authentication/templates/test_unit/controllers/html/registrations_controller_test.rb.tt
|
128
126
|
- lib/generators/authentication/templates/test_unit/controllers/html/sessions_controller_test.rb.tt
|
129
127
|
- lib/generators/authentication/templates/test_unit/mailers/user_mailer_test.rb.tt
|
130
|
-
- lib/generators/authentication/templates/test_unit/system/identity/emails_test.rb.tt
|
131
|
-
- lib/generators/authentication/templates/test_unit/system/identity/password_resets_test.rb.tt
|
132
|
-
- lib/generators/authentication/templates/test_unit/system/passwords_test.rb.tt
|
133
|
-
- lib/generators/authentication/templates/test_unit/system/registrations_test.rb.tt
|
134
|
-
- lib/generators/authentication/templates/test_unit/system/sessions_test.rb.tt
|
135
128
|
- lib/generators/authentication/templates/test_unit/test_helper.rb.tt
|
136
129
|
- lib/generators/authentication/templates/test_unit/users.yml
|
137
130
|
homepage: https://github.com/lazaronixon/authentication-zero
|
@@ -156,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
156
149
|
- !ruby/object:Gem::Version
|
157
150
|
version: '0'
|
158
151
|
requirements: []
|
159
|
-
rubygems_version: 3.
|
152
|
+
rubygems_version: 3.5.5
|
160
153
|
signing_key:
|
161
154
|
specification_version: 4
|
162
155
|
summary: An authentication system generator for Rails applications
|
@@ -1,11 +0,0 @@
|
|
1
|
-
import { Application } from "@hotwired/stimulus"
|
2
|
-
import WebAuthnController from "stimulus-web-authn"
|
3
|
-
|
4
|
-
const application = Application.start()
|
5
|
-
application.register("web-authn", WebAuthnController)
|
6
|
-
|
7
|
-
// Configure Stimulus development experience
|
8
|
-
application.debug = false
|
9
|
-
window.Stimulus = application
|
10
|
-
|
11
|
-
export { application }
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
|
4
|
-
driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400]
|
5
|
-
|
6
|
-
def sign_in_as(user)
|
7
|
-
visit sign_in_url
|
8
|
-
fill_in :email, with: user.email
|
9
|
-
fill_in :password, with: "Secret1*3*5*"
|
10
|
-
click_on "Sign in"
|
11
|
-
|
12
|
-
assert_current_path root_url
|
13
|
-
user
|
14
|
-
end
|
15
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require "application_system_test_case"
|
2
|
-
|
3
|
-
class Identity::EmailsTest < ApplicationSystemTestCase
|
4
|
-
setup do
|
5
|
-
@user = sign_in_as(users(:lazaro_nixon))
|
6
|
-
end
|
7
|
-
|
8
|
-
test "updating the email" do
|
9
|
-
click_on "Change email address"
|
10
|
-
|
11
|
-
fill_in "New email", with: "new_email@hey.com"
|
12
|
-
fill_in "Password challenge", with: "Secret1*3*5*"
|
13
|
-
click_on "Save changes"
|
14
|
-
|
15
|
-
assert_text "Your email has been changed"
|
16
|
-
end
|
17
|
-
|
18
|
-
test "sending a verification email" do
|
19
|
-
@user.update! verified: false
|
20
|
-
|
21
|
-
click_on "Change email address"
|
22
|
-
click_on "Re-send verification email"
|
23
|
-
|
24
|
-
assert_text "We sent a verification email to your email address"
|
25
|
-
end
|
26
|
-
end
|
data/lib/generators/authentication/templates/test_unit/system/identity/password_resets_test.rb.tt
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require "application_system_test_case"
|
2
|
-
|
3
|
-
class Identity::PasswordResetsTest < ApplicationSystemTestCase
|
4
|
-
setup do
|
5
|
-
@user = users(:lazaro_nixon)
|
6
|
-
@sid = @user.generate_token_for(:password_reset)
|
7
|
-
end
|
8
|
-
|
9
|
-
test "sending a password reset email" do
|
10
|
-
visit sign_in_url
|
11
|
-
click_on "Forgot your password?"
|
12
|
-
|
13
|
-
fill_in "Email", with: @user.email
|
14
|
-
click_on "Send password reset email"
|
15
|
-
|
16
|
-
assert_text "Check your email for reset instructions"
|
17
|
-
end
|
18
|
-
|
19
|
-
test "updating password" do
|
20
|
-
visit edit_identity_password_reset_url(sid: @sid)
|
21
|
-
|
22
|
-
fill_in "New password", with: "Secret6*4*2*"
|
23
|
-
fill_in "Confirm new password", with: "Secret6*4*2*"
|
24
|
-
click_on "Save changes"
|
25
|
-
|
26
|
-
assert_text "Your password was reset successfully. Please sign in"
|
27
|
-
end
|
28
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require "application_system_test_case"
|
2
|
-
|
3
|
-
class PasswordsTest < ApplicationSystemTestCase
|
4
|
-
setup do
|
5
|
-
@user = sign_in_as(users(:lazaro_nixon))
|
6
|
-
end
|
7
|
-
|
8
|
-
test "updating the password" do
|
9
|
-
click_on "Change password"
|
10
|
-
|
11
|
-
fill_in "Password challenge", with: "Secret1*3*5*"
|
12
|
-
fill_in "New password", with: "Secret6*4*2*"
|
13
|
-
fill_in "Confirm new password", with: "Secret6*4*2*"
|
14
|
-
click_on "Save changes"
|
15
|
-
|
16
|
-
assert_text "Your password has been changed"
|
17
|
-
end
|
18
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require "application_system_test_case"
|
2
|
-
|
3
|
-
class RegistrationsTest < ApplicationSystemTestCase
|
4
|
-
test "signing up" do
|
5
|
-
visit sign_up_url
|
6
|
-
|
7
|
-
fill_in "Email", with: "lazaronixon@hey.com"
|
8
|
-
fill_in "Password", with: "Secret6*4*2*"
|
9
|
-
fill_in "Password confirmation", with: "Secret6*4*2*"
|
10
|
-
click_on "Sign up"
|
11
|
-
|
12
|
-
assert_text "Welcome! You have signed up successfully"
|
13
|
-
end
|
14
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require "application_system_test_case"
|
2
|
-
|
3
|
-
class SessionsTest < ApplicationSystemTestCase
|
4
|
-
setup do
|
5
|
-
@user = users(:lazaro_nixon)
|
6
|
-
end
|
7
|
-
|
8
|
-
test "visiting the index" do
|
9
|
-
sign_in_as @user
|
10
|
-
|
11
|
-
click_on "Devices & Sessions"
|
12
|
-
assert_selector "h1", text: "Sessions"
|
13
|
-
end
|
14
|
-
|
15
|
-
test "signing in" do
|
16
|
-
visit sign_in_url
|
17
|
-
fill_in "Email", with: @user.email
|
18
|
-
fill_in "Password", with: "Secret1*3*5*"
|
19
|
-
click_on "Sign in"
|
20
|
-
|
21
|
-
assert_text "Signed in successfully"
|
22
|
-
end
|
23
|
-
|
24
|
-
test "signing out" do
|
25
|
-
sign_in_as @user
|
26
|
-
|
27
|
-
click_on "Log out"
|
28
|
-
assert_text "That session has been logged out"
|
29
|
-
end
|
30
|
-
end
|