authentication-zero 2.9.0 → 2.9.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.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +5 -0
  4. data/authentication-zero-api.md +210 -0
  5. data/lib/authentication_zero/version.rb +1 -1
  6. data/lib/generators/authentication/authentication_generator.rb +17 -67
  7. data/lib/generators/authentication/templates/controllers/api/application_controller.rb.tt +26 -0
  8. data/lib/generators/authentication/templates/controllers/html/application_controller.rb.tt +24 -0
  9. data/lib/generators/authentication/templates/erb/identity/password_resets/edit.html.erb.tt +2 -2
  10. data/lib/generators/authentication/templates/erb/passwords/edit.html.erb.tt +3 -3
  11. data/lib/generators/authentication/templates/erb/registrations/new.html.erb.tt +2 -2
  12. data/lib/generators/authentication/templates/erb/sessions/sudos/new.html.erb.tt +1 -1
  13. data/lib/generators/authentication/templates/models/model.rb.tt +2 -2
  14. data/lib/generators/authentication/templates/test_unit/application_system_test_case.rb.tt +15 -0
  15. data/lib/generators/authentication/templates/test_unit/controllers/api/identity/email_verifications_controller_test.rb.tt +0 -4
  16. data/lib/generators/authentication/templates/test_unit/controllers/api/identity/emails_controller_test.rb.tt +0 -4
  17. data/lib/generators/authentication/templates/test_unit/controllers/api/passwords_controller_test.rb.tt +0 -4
  18. data/lib/generators/authentication/templates/test_unit/controllers/api/sessions/sudos_controller_test.rb.tt +0 -4
  19. data/lib/generators/authentication/templates/test_unit/controllers/api/sessions_controller_test.rb.tt +0 -4
  20. data/lib/generators/authentication/templates/test_unit/controllers/html/identity/email_verifications_controller_test.rb.tt +0 -4
  21. data/lib/generators/authentication/templates/test_unit/controllers/html/identity/emails_controller_test.rb.tt +0 -4
  22. data/lib/generators/authentication/templates/test_unit/controllers/html/passwords_controller_test.rb.tt +0 -4
  23. data/lib/generators/authentication/templates/test_unit/controllers/html/sessions/sudos_controller_test.rb.tt +0 -4
  24. data/lib/generators/authentication/templates/test_unit/controllers/html/sessions_controller_test.rb.tt +0 -4
  25. data/lib/generators/authentication/templates/test_unit/system/identity/emails_test.rb.tt +0 -10
  26. data/lib/generators/authentication/templates/test_unit/system/passwords_test.rb.tt +0 -10
  27. data/lib/generators/authentication/templates/test_unit/system/sessions/sudos_test.rb.tt +0 -10
  28. data/lib/generators/authentication/templates/test_unit/system/sessions_test.rb.tt +4 -7
  29. data/lib/generators/authentication/templates/test_unit/test_helper.rb.tt +22 -0
  30. metadata +7 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 17c277204408ebec113d5e006bec8407d237756e4f86c67dae7a0e01c4a1c0de
4
- data.tar.gz: 87c2e57c9035847f84abc12b1c4f0a7350c4a010cd9c6fc8442d9c229b646af7
3
+ metadata.gz: d8173a1510dfbe78180ce29cbb83b5f79b84b0ed4ecacf0569344905c28f2a01
4
+ data.tar.gz: 9d89bc1c96a4b59b7c7bf2437bd038036e747f4e78c0a7d5a81f1c0ae4c86f28
5
5
  SHA512:
6
- metadata.gz: 2bb208d31c2d4a5d9af479253f39db98e5c2182796a74debb06aeadcdec22547abd29b90a6f440cca29405ef2110937d2a5185085f3f321acd705d409ec65b16
7
- data.tar.gz: f36f9a8791f1bcb6b821c69694b416481aa3811383f55027362e9a92cd3e1aea11436aab998b50eea620b089a84ee05fa88725732fa087bf570794c105085ba6
6
+ metadata.gz: 34a5ed73cbd7f5e35cd9a1e16ae0e4880a677ffa94f3892c0c6292abb436b3fded01c4664dd5e77d5b8025718b60ea8507bdbd968243d94ef191980615b02ea4
7
+ data.tar.gz: 2afb2c4fbc2bef0c7e06fab12cf783f04c6bc811d7150ed58f4a73f430c23925f4e790c6e3477729e04f2ade59b80dd30220667952d7b41cc98a4106fc4e064e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- authentication-zero (2.9.0)
4
+ authentication-zero (2.9.3)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -22,6 +22,7 @@ The purpose of authentication zero is to generate a pre-built authentication sys
22
22
  - Manage multiple sessions & devices
23
23
  - Activity log (--trackable)
24
24
  - Log out
25
+ - [API documentation](https://github.com/lazaronixon/authentication-zero/blob/master/authentication-zero-api.md)
25
26
 
26
27
  ## Security and best practices
27
28
 
@@ -74,6 +75,10 @@ Add these lines to your `app/views/home/index.html.erb`:
74
75
  <%= link_to "Devices & Sessions", sessions_path %>
75
76
  </div>
76
77
 
78
+ <div>
79
+ <%# link_to "Activity Log", authentications_events_path %>
80
+ </div>
81
+
77
82
  <br>
78
83
 
79
84
  <%= button_to "Log out", Current.session, method: :delete %>
@@ -0,0 +1,210 @@
1
+ # Authentication Zero API
2
+
3
+ This document describe the api endpoints available in authentication-zero.
4
+
5
+ ## Making a request
6
+
7
+ To make a sign in request for example, append sign_in to the base URL to form something like http://localhost:3000/sign_in, also notice you have to include the Content-Type header and the JSON data: In cURL, it looks like this:
8
+
9
+ ``` shell
10
+ curl -H "Authorization: Bearer $ACCESS_TOKEN" \
11
+ -H 'Content-Type: application/json' \
12
+ -H 'User-Agent: MyApp (yourname@example.com)' \
13
+ -d '{ "email": "lazaronixon@hotmail.com", "password": "secret", "password_confirmation": "secret" }' \
14
+ http://localhost:3000/sign_in
15
+ ```
16
+
17
+ ## API endpoints
18
+
19
+ - [Sign up](#sign-up)
20
+ - [Sign in](#sign-in)
21
+ - [Get your sessions](#get-your-sessions)
22
+ - [Get a session](#get-a-session)
23
+ - [Destroy a session](#destroy-a-session)
24
+ - [Execute sudo](#execute-sudo)
25
+ - [Update your password](#update-your-password)
26
+ - [Update your email](#update-your-email)
27
+ - [Send verification email](#send-verification-email)
28
+ - [Verify email](#verify-email)
29
+ - [Send password reset email](#send-password-reset-email)
30
+ - [Reset password](#reset-password)
31
+
32
+ ## Registrations
33
+
34
+ ### Sign up
35
+
36
+ * `POST /sign_up` creates a user on database.
37
+
38
+ ###### Example JSON Request
39
+
40
+ ``` json
41
+ {
42
+ "email": "lazaronixon@hotmail.com",
43
+ "password": "Secret1*2*3*4*5*6",
44
+ "password_confirmation": "Secret1*2*3*4*5*6"
45
+ }
46
+ ```
47
+
48
+ This endpoint will return `201 Created` with the current JSON representation of the user if the creation was a success.
49
+
50
+ ## Sessions
51
+
52
+ ### Sign in
53
+
54
+ * `POST /sign_in` creates a session on database.
55
+
56
+ ###### Example JSON Request
57
+
58
+ ``` json
59
+ {
60
+ "email": "lazaronixon@hotmail.com",
61
+ "password": "Secret1*2*3*4*5*6"
62
+ }
63
+ ```
64
+
65
+ This endpoint will return `201 Created` with the current JSON representation of the session if the creation was a success, also you will receive a `X-Session-Token` that you will use as your authorization token.
66
+
67
+
68
+ ### Get your sessions
69
+
70
+ * `GET /sessions` will return a list of sessions.
71
+
72
+ ###### Example JSON Response
73
+
74
+ ``` json
75
+ [
76
+ {
77
+ "id": 2,
78
+ "user_id": 1,
79
+ "user_agent": "insomnia/2022.1.0",
80
+ "ip_address": "127.0.0.1",
81
+ "sudo_at": "2022-03-04T17:20:33.632Z",
82
+ "created_at": "2022-03-04T17:20:33.632Z",
83
+ "updated_at": "2022-03-04T17:20:33.632Z"
84
+ },
85
+ {
86
+ "id": 1,
87
+ "user_id": 1,
88
+ "user_agent": "insomnia/2022.1.0",
89
+ "ip_address": "127.0.0.1",
90
+ "sudo_at": "2022-03-04T17:14:03.386Z",
91
+ "created_at": "2022-03-04T17:14:03.386Z",
92
+ "updated_at": "2022-03-04T17:14:03.386Z"
93
+ }
94
+ ]
95
+ ```
96
+
97
+ ### Get a session
98
+
99
+ * `GET /sessions/1` will return the session with an ID of 1.
100
+
101
+ ###### Example JSON Response
102
+
103
+ ``` json
104
+ {
105
+ "id": 1,
106
+ "user_id": 1,
107
+ "user_agent": "insomnia/2022.1.0",
108
+ "ip_address": "127.0.0.1",
109
+ "sudo_at": "2022-03-04T17:14:03.386Z",
110
+ "created_at": "2022-03-04T17:14:03.386Z",
111
+ "updated_at": "2022-03-04T17:14:03.386Z"
112
+ }
113
+ ```
114
+
115
+ ### Destroy a session
116
+
117
+ * `DELETE /sessions/1` will destroy the session with an ID of 1.
118
+
119
+ Returns `204 No Content` if successful.
120
+
121
+
122
+ ### Execute sudo
123
+
124
+ * `POST /sessions/sudo` will grant temporary access to sensitive information.
125
+
126
+ ###### Example JSON Request
127
+
128
+ ``` json
129
+ {
130
+ "password": "Secret1*2*3*4*5*6",
131
+ }
132
+ ```
133
+
134
+ Returns `204 No Content` if successful.
135
+
136
+ ## Password
137
+
138
+ ### Update your password
139
+
140
+ * `PUT /password` allows changing your password.
141
+
142
+ ###### Example JSON Request
143
+
144
+ ``` json
145
+ {
146
+ "current_password": "Secret1*2*3*4*5*6",
147
+ "password": "NewPassword12$34$56$7",
148
+ "password_confirmation": "NewPassword12$34$56$7"
149
+ }
150
+ ```
151
+
152
+ This endpoint will return 200 OK with the current JSON representation of the user if the update was a success.
153
+
154
+ ## Email
155
+
156
+ ### Update your email
157
+
158
+ * `PUT /identity/email` allows changing your email. **(requires sudo)**.
159
+
160
+ ###### Example JSON Request
161
+
162
+ ``` json
163
+ {
164
+ "email": "new_email@hey.com"
165
+ }
166
+ ```
167
+
168
+ This endpoint will return 200 OK with the current JSON representation of the user if the update was a success.
169
+
170
+ ## Email verification
171
+
172
+ ### Send verification email
173
+
174
+ * `POST /identity/email_verification` sends an email verification with the instructions and link to proceed with the verification.
175
+
176
+ Returns `204 No Content` if successful.
177
+
178
+ ### Verify email
179
+
180
+ * `GET /identity/email_verification` verify your email using a temporary token.
181
+
182
+ **Required parameters:** `email` and `token`.
183
+
184
+ Example: `/identity/email_verification?email=lazaronixon@hotmail.com&token=eyJfcmFpbHMiOnsibWVzc2FnZSI6Ik1nPT0iLCJleHAiOm51bGwsInB1ciI6InNlc3Npb24ifX0=--1a277b4a5576c6e371144a22476979a18d3e45fb8515a79e815cd4b95eb5fb6b`
185
+
186
+ Returns `204 No Content` if successful.
187
+
188
+ ## Password reset
189
+
190
+ ### Send password reset email
191
+
192
+ * `POST /identity/password_reset` sends a password reset email with the instructions and link to proceed reset.
193
+
194
+ Returns `204 No Content` if successful.
195
+
196
+ ### Reset password
197
+
198
+ * `PUT /identity/password_reset` allows changing your password through a email token.
199
+
200
+ ##### Example JSON Request
201
+
202
+ ``` json
203
+ {
204
+ "password": "NewPassword12$34$56$7",
205
+ "password_confirmation": "NewPassword12$34$56$7",
206
+ "token": "eyJfcmFpbHMiOnsibWVzc2FnZSI6Ik1nPT0iLCJleHAiOm51bGwsInB1ciI6InNlc3Npb24ifX0=--1a277b4a5576c6e371144a22476979a18d3e45fb8515a79e815cd4b95eb5fb6b",
207
+ }
208
+ ```
209
+
210
+ This endpoint will return 200 OK with the current JSON representation of the user if the update was a success.
@@ -1,3 +1,3 @@
1
1
  module AuthenticationZero
2
- VERSION = "2.9.0"
2
+ VERSION = "2.9.3"
3
3
  end
@@ -32,12 +32,12 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
32
32
  end
33
33
 
34
34
  def create_configuration_files
35
- copy_file "config/redis/shared.yml", "config/redis/shared.yml" if options.lockable?
36
- copy_file "config/initializers/omniauth.rb", "config/initializers/omniauth.rb" if omniauthable?
35
+ copy_file "config/redis/shared.yml", "config/redis/shared.yml" if options.lockable?
36
+ copy_file "config/initializers/omniauth.rb", "config/initializers/omniauth.rb" if omniauthable?
37
37
  end
38
38
 
39
39
  def add_environment_configurations
40
- ratelimit_code = <<~CODE
40
+ ratelimit_code = <<~CODE
41
41
  # Rate limit general requests by IP address in a rate of 1000 requests per hour
42
42
  config.middleware.use(Rack::Ratelimit, name: "General", rate: [1000, 1.hour], redis: Redis.new, logger: Rails.logger) { |env| ActionDispatch::Request.new(env).ip }
43
43
  CODE
@@ -63,64 +63,9 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
63
63
  template "test_unit/fixtures.yml", "test/fixtures/#{fixture_file_name}.yml"
64
64
  end
65
65
 
66
- def add_application_controller_methods
67
- api_code = <<~CODE
68
- include ActionController::HttpAuthentication::Token::ControllerMethods
69
-
70
- before_action :set_current_request_details
71
- before_action :authenticate
72
-
73
- def require_sudo
74
- if Current.session.sudo_at < 30.minutes.ago
75
- render json: { error: "Enter your password to continue" }, status: :forbidden
76
- end
77
- end
78
-
79
- private
80
- def authenticate
81
- if session = authenticate_with_http_token { |token, _| Session.find_signed(token) }
82
- Current.session = session
83
- else
84
- request_http_token_authentication
85
- end
86
- end
87
-
88
- def set_current_request_details
89
- Current.user_agent = request.user_agent
90
- Current.ip_address = request.ip
91
- end
92
- CODE
93
-
94
- html_code = <<~CODE
95
- before_action :set_current_request_details
96
- before_action :authenticate
97
-
98
- def require_sudo
99
- if Current.session.sudo_at < 30.minutes.ago
100
- redirect_to new_sessions_sudo_path(proceed_to_url: request.url)
101
- end
102
- end
103
-
104
- private
105
- def authenticate
106
- if session = Session.find_by_id(cookies.signed[:session_token])
107
- Current.session = session
108
- else
109
- redirect_to sign_in_path
110
- end
111
- end
112
-
113
- def set_current_request_details
114
- Current.user_agent = request.user_agent
115
- Current.ip_address = request.ip
116
- end
117
- CODE
118
-
119
- inject_code = options.api? ? api_code : html_code
120
- inject_into_class "app/controllers/application_controller.rb", "ApplicationController", optimize_indentation(inject_code, 2), verbose: false
121
- end
122
-
123
66
  def create_controllers
67
+ template "controllers/#{format_folder}/application_controller.rb", "app/controllers/application_controller.rb", force: true
68
+
124
69
  directory "controllers/#{format_folder}/identity", "app/controllers/identity"
125
70
  template "controllers/#{format_folder}/passwords_controller.rb", "app/controllers/passwords_controller.rb"
126
71
  template "controllers/#{format_folder}/registrations_controller.rb", "app/controllers/registrations_controller.rb"
@@ -135,6 +80,9 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
135
80
  directory "erb/identity_mailer", "app/views/identity_mailer"
136
81
  directory "erb/session_mailer", "app/views/session_mailer"
137
82
  else
83
+ directory "erb/identity_mailer", "app/views/identity_mailer"
84
+ directory "erb/session_mailer", "app/views/session_mailer"
85
+
138
86
  directory "erb/identity", "app/views/identity"
139
87
  directory "erb/passwords", "app/views/passwords"
140
88
  directory "erb/registrations", "app/views/registrations"
@@ -150,29 +98,31 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
150
98
  def add_routes
151
99
  if omniauthable?
152
100
  route "post '/auth/:provider/callback', to: 'sessions/omniauth#create'"
153
- route "get '/auth/:provider/callback', to: 'sessions/omniauth#create'"
154
- route "get '/auth/failure', to: 'sessions/omniauth#failure'"
101
+ route "get '/auth/:provider/callback', to: 'sessions/omniauth#create'"
102
+ route "get '/auth/failure', to: 'sessions/omniauth#failure'"
155
103
  end
156
104
 
157
105
  if options.trackable?
158
106
  route "resources :events, only: :index", namespace: :authentications
159
107
  end
160
108
 
161
- route "resource :password_reset, only: [:new, :edit, :create, :update]", namespace: :identity
109
+ route "resource :password_reset, only: [:new, :edit, :create, :update]", namespace: :identity
162
110
  route "resource :email_verification, only: [:edit, :create]", namespace: :identity
163
- route "resource :email, only: [:edit, :update]", namespace: :identity
111
+ route "resource :email, only: [:edit, :update]", namespace: :identity
164
112
  route "resource :sudo, only: [:new, :create]", namespace: :sessions
113
+ route "resource :password, only: [:edit, :update]"
165
114
  route "resources :sessions, only: [:index, :show, :destroy]"
166
- route "resource :password, only: [:edit, :update]"
167
115
  route "post 'sign_up', to: 'registrations#create'"
168
- route "get 'sign_up', to: 'registrations#new'" unless options.api?
116
+ route "get 'sign_up', to: 'registrations#new'" unless options.api?
169
117
  route "post 'sign_in', to: 'sessions#create'"
170
- route "get 'sign_in', to: 'sessions#new'" unless options.api?
118
+ route "get 'sign_in', to: 'sessions#new'" unless options.api?
171
119
  end
172
120
 
173
121
  def create_test_files
174
122
  directory "test_unit/controllers/#{format_folder}", "test/controllers"
175
123
  directory "test_unit/system", "test/system" unless options.api?
124
+ template "test_unit/test_helper.rb", "test/test_helper.rb", force: true
125
+ template "test_unit/application_system_test_case.rb", "test/application_system_test_case.rb", force: true unless options.api?
176
126
  end
177
127
 
178
128
  private
@@ -0,0 +1,26 @@
1
+ class ApplicationController < ActionController::API
2
+ include ActionController::HttpAuthentication::Token::ControllerMethods
3
+
4
+ before_action :set_current_request_details
5
+ before_action :authenticate
6
+
7
+ def require_sudo
8
+ if Current.session.sudo_at < 30.minutes.ago
9
+ render json: { error: "Enter your password to continue" }, status: :forbidden
10
+ end
11
+ end
12
+
13
+ private
14
+ def authenticate
15
+ if session = authenticate_with_http_token { |token, _| Session.find_signed(token) }
16
+ Current.session = session
17
+ else
18
+ request_http_token_authentication
19
+ end
20
+ end
21
+
22
+ def set_current_request_details
23
+ Current.user_agent = request.user_agent
24
+ Current.ip_address = request.ip
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ class ApplicationController < ActionController::Base
2
+ before_action :set_current_request_details
3
+ before_action :authenticate
4
+
5
+ def require_sudo
6
+ if Current.session.sudo_at < 30.minutes.ago
7
+ redirect_to new_sessions_sudo_path(proceed_to_url: request.url)
8
+ end
9
+ end
10
+
11
+ private
12
+ def authenticate
13
+ if session = Session.find_by_id(cookies.signed[:session_token])
14
+ Current.session = session
15
+ else
16
+ redirect_to sign_in_path
17
+ end
18
+ end
19
+
20
+ def set_current_request_details
21
+ Current.user_agent = request.user_agent
22
+ Current.ip_address = request.ip
23
+ end
24
+ end
@@ -17,13 +17,13 @@
17
17
 
18
18
  <div>
19
19
  <%%= form.label :password, "New password", style: "display: block" %>
20
- <%%= form.password_field :password, autofocus: true, autocomplete: "new-password" %>
20
+ <%%= form.password_field :password, required: true, autofocus: true, autocomplete: "new-password" %>
21
21
  <div>12 characters minimum.</div>
22
22
  </div>
23
23
 
24
24
  <div>
25
25
  <%%= form.label :password_confirmation, "Confirm new password", style: "display: block" %>
26
- <%%= form.password_field :password_confirmation, autocomplete: "new-password" %>
26
+ <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password" %>
27
27
  </div>
28
28
 
29
29
  <div>
@@ -17,18 +17,18 @@
17
17
 
18
18
  <div>
19
19
  <%%= label_tag :current_password, nil, style: "display: block" %>
20
- <%%= password_field_tag :current_password, nil, autofocus: true, autocomplete: "current-password" %>
20
+ <%%= password_field_tag :current_password, nil, required: true, autofocus: true, autocomplete: "current-password" %>
21
21
  </div>
22
22
 
23
23
  <div>
24
24
  <%%= form.label :password, "New password", style: "display: block" %>
25
- <%%= form.password_field :password, autocomplete: "new-password" %>
25
+ <%%= form.password_field :password, required: true, autocomplete: "new-password" %>
26
26
  <div>12 characters minimum.</div>
27
27
  </div>
28
28
 
29
29
  <div>
30
30
  <%%= form.label :password_confirmation, "Confirm new password", style: "display: block" %>
31
- <%%= form.password_field :password_confirmation, autocomplete: "new-password" %>
31
+ <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password" %>
32
32
  </div>
33
33
 
34
34
  <div>
@@ -20,13 +20,13 @@
20
20
 
21
21
  <div>
22
22
  <%%= form.label :password, style: "display: block" %>
23
- <%%= form.password_field :password, autocomplete: "new-password" %>
23
+ <%%= form.password_field :password, required: true, autocomplete: "new-password" %>
24
24
  <div>12 characters minimum.</div>
25
25
  </div>
26
26
 
27
27
  <div>
28
28
  <%%= form.label :password_confirmation, style: "display: block" %>
29
- <%%= form.password_field :password_confirmation, autocomplete: "new-password" %>
29
+ <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password" %>
30
30
  </div>
31
31
 
32
32
  <div>
@@ -7,7 +7,7 @@
7
7
  <%%= hidden_field_tag :proceed_to_url, params[:proceed_to_url] %>
8
8
 
9
9
  <div>
10
- <%%= password_field_tag :password, nil, autofocus: true, autocomplete: "current-password" %>
10
+ <%%= password_field_tag :password, nil, required: true, autofocus: true, autocomplete: "current-password" %>
11
11
  </div>
12
12
 
13
13
  <div>
@@ -9,8 +9,8 @@ class <%= class_name %> < ApplicationRecord
9
9
  validates :email, presence: true, uniqueness: true
10
10
  validates_format_of :email, with: /\A[^@\s]+@[^@\s]+\z/
11
11
 
12
- validates_length_of :password, minimum: 12, allow_blank: true
13
- validates_format_of :password, with: /(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])/, allow_blank: true, message: "might easily be guessed"
12
+ validates_length_of :password, minimum: 12, allow_nil: true
13
+ validates_format_of :password, with: /(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])/, allow_nil: true, message: "might easily be guessed"
14
14
  <% if options.pwned? -%>
15
15
  validates :password, not_pwned: { message: "might easily be guessed" }
16
16
  <% end -%>
@@ -0,0 +1,15 @@
1
+ require "test_helper"
2
+
3
+ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
4
+ driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
5
+
6
+ def sign_in_as(<%= singular_table_name %>)
7
+ visit sign_in_url
8
+ fill_in :email, with: <%= singular_table_name %>.email
9
+ fill_in :password, with: "Secret1*3*5*"
10
+ click_on "Sign in"
11
+
12
+ assert_current_path root_url
13
+ return <%= singular_table_name %>
14
+ end
15
+ end
@@ -37,8 +37,4 @@ class Identity::EmailVerificationsControllerTest < ActionDispatch::IntegrationTe
37
37
  assert_response :bad_request
38
38
  assert_equal "That email verification link is invalid", response.parsed_body["error"]
39
39
  end
40
-
41
- def sign_in_as(<%= singular_table_name %>)
42
- post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); [<%= singular_table_name %>, response.headers["X-Session-Token"]]
43
- end
44
40
  end
@@ -18,8 +18,4 @@ class Identity::EmailsControllerTest < ActionDispatch::IntegrationTest
18
18
  assert_response :forbidden
19
19
  assert_equal "Enter your password to continue", response.parsed_body["error"]
20
20
  end
21
-
22
- def sign_in_as(<%= singular_table_name %>)
23
- post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); [<%= singular_table_name %>, response.headers["X-Session-Token"]]
24
- end
25
21
  end
@@ -16,8 +16,4 @@ class PasswordsControllerTest < ActionDispatch::IntegrationTest
16
16
  assert_response :bad_request
17
17
  assert_equal "The current password you entered is incorrect", response.parsed_body["error"]
18
18
  end
19
-
20
- def sign_in_as(<%= singular_table_name %>)
21
- post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); [<%= singular_table_name %>, response.headers["X-Session-Token"]]
22
- end
23
19
  end
@@ -17,8 +17,4 @@ class Sessions::SudosControllerTest < ActionDispatch::IntegrationTest
17
17
  assert_response :bad_request
18
18
  assert_equal "The password you entered is incorrect", response.parsed_body["error"]
19
19
  end
20
-
21
- def sign_in_as(<%= singular_table_name %>)
22
- post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); [<%= singular_table_name %>, response.headers["X-Session-Token"]]
23
- end
24
20
  end
@@ -31,8 +31,4 @@ class SessionsControllerTest < ActionDispatch::IntegrationTest
31
31
  delete session_url(@<%= singular_table_name %>.sessions.last), headers: { "Authorization" => "Bearer #{@token}" }
32
32
  assert_response :no_content
33
33
  end
34
-
35
- def sign_in_as(<%= singular_table_name %>)
36
- post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); [<%= singular_table_name %>, response.headers["X-Session-Token"]]
37
- end
38
34
  end
@@ -37,8 +37,4 @@ class Identity::EmailVerificationsControllerTest < ActionDispatch::IntegrationTe
37
37
  assert_redirected_to edit_identity_email_url
38
38
  assert_equal "That email verification link is invalid", flash[:alert]
39
39
  end
40
-
41
- def sign_in_as(<%= singular_table_name %>)
42
- post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); <%= singular_table_name %>
43
- end
44
40
  end
@@ -28,8 +28,4 @@ class Identity::EmailsControllerTest < ActionDispatch::IntegrationTest
28
28
  patch identity_email_url, params: { email: "new_email@hey.com" }
29
29
  assert_redirected_to new_sessions_sudo_url(proceed_to_url: identity_email_url)
30
30
  end
31
-
32
- def sign_in_as(<%= singular_table_name %>)
33
- post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); <%= singular_table_name %>
34
- end
35
31
  end
@@ -21,8 +21,4 @@ class PasswordsControllerTest < ActionDispatch::IntegrationTest
21
21
  assert_redirected_to edit_password_url
22
22
  assert_equal "The current password you entered is incorrect", flash[:alert]
23
23
  end
24
-
25
- def sign_in_as(<%= singular_table_name %>)
26
- post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); <%= singular_table_name %>
27
- end
28
24
  end
@@ -19,8 +19,4 @@ class Sessions::SudosControllerTest < ActionDispatch::IntegrationTest
19
19
  post sessions_sudo_url, params: { password: "SecretWrong1*3", proceed_to_url: edit_password_url }
20
20
  assert_redirected_to new_sessions_sudo_url(proceed_to_url: edit_password_url)
21
21
  end
22
-
23
- def sign_in_as(<%= singular_table_name %>)
24
- post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); [<%= singular_table_name %>, response.headers["X-Session-Token"]]
25
- end
26
22
  end
@@ -45,8 +45,4 @@ class SessionsControllerTest < ActionDispatch::IntegrationTest
45
45
  follow_redirect!
46
46
  assert_redirected_to sign_in_url
47
47
  end
48
-
49
- def sign_in_as(<%= singular_table_name %>)
50
- post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); <%= singular_table_name %>
51
- end
52
48
  end
@@ -22,14 +22,4 @@ class Identity::EmailsTest < ApplicationSystemTestCase
22
22
 
23
23
  assert_text "We sent a verification email to your email address"
24
24
  end
25
-
26
- def sign_in_as(<%= singular_table_name %>)
27
- visit sign_in_url
28
- fill_in :email, with: <%= singular_table_name %>.email
29
- fill_in :password, with: "Secret1*3*5*"
30
- click_on "Sign in"
31
-
32
- assert_current_path root_url
33
- return <%= singular_table_name %>
34
- end
35
25
  end
@@ -15,14 +15,4 @@ class PasswordsTest < ApplicationSystemTestCase
15
15
 
16
16
  assert_text "Your password has been changed"
17
17
  end
18
-
19
- def sign_in_as(<%= singular_table_name %>)
20
- visit sign_in_url
21
- fill_in :email, with: <%= singular_table_name %>.email
22
- fill_in :password, with: "Secret1*3*5*"
23
- click_on "Sign in"
24
-
25
- assert_current_path root_url
26
- return <%= singular_table_name %>
27
- end
28
18
  end
@@ -12,14 +12,4 @@ class Sessions::SudosTest < ApplicationSystemTestCase
12
12
 
13
13
  assert_selector "h1", text: "Change your password"
14
14
  end
15
-
16
- def sign_in_as(<%= singular_table_name %>)
17
- visit sign_in_url
18
- fill_in :email, with: <%= singular_table_name %>.email
19
- fill_in :password, with: "Secret1*3*5*"
20
- click_on "Sign in"
21
-
22
- assert_current_path root_url
23
- return <%= singular_table_name %>
24
- end
25
15
  end
@@ -21,13 +21,10 @@ class SessionsTest < ApplicationSystemTestCase
21
21
  assert_text "Signed in successfully"
22
22
  end
23
23
 
24
- def sign_in_as(<%= singular_table_name %>)
25
- visit sign_in_url
26
- fill_in :email, with: <%= singular_table_name %>.email
27
- fill_in :password, with: "Secret1*3*5*"
28
- click_on "Sign in"
24
+ test "signing out" do
25
+ sign_in_as @<%= singular_table_name %>
29
26
 
30
- assert_current_path root_url
31
- return <%= singular_table_name %>
27
+ click_on "Log out"
28
+ assert_text "That session has been logged out"
32
29
  end
33
30
  end
@@ -0,0 +1,22 @@
1
+ ENV["RAILS_ENV"] ||= "test"
2
+ require_relative "../config/environment"
3
+ require "rails/test_help"
4
+
5
+ class ActiveSupport::TestCase
6
+ # Run tests in parallel with specified workers
7
+ parallelize(workers: :number_of_processors)
8
+
9
+ # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
10
+ fixtures :all
11
+
12
+ # Add more helper methods to be used by all tests here...
13
+ <% if options.api? -%>
14
+ def sign_in_as(<%= singular_table_name %>)
15
+ post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); [<%= singular_table_name %>, response.headers["X-Session-Token"]]
16
+ end
17
+ <% else -%>
18
+ def sign_in_as(<%= singular_table_name %>)
19
+ post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret1*3*5*" }); <%= singular_table_name %>
20
+ end
21
+ <% end -%>
22
+ 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: 2.9.0
4
+ version: 2.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nixon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-04 00:00:00.000000000 Z
11
+ date: 2022-03-08 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -26,6 +26,7 @@ files:
26
26
  - LICENSE.txt
27
27
  - README.md
28
28
  - Rakefile
29
+ - authentication-zero-api.md
29
30
  - authentication-zero.gemspec
30
31
  - lib/authentication-zero.rb
31
32
  - lib/authentication_zero.rb
@@ -34,6 +35,7 @@ files:
34
35
  - lib/generators/authentication/authentication_generator.rb
35
36
  - lib/generators/authentication/templates/config/initializers/omniauth.rb
36
37
  - lib/generators/authentication/templates/config/redis/shared.yml
38
+ - lib/generators/authentication/templates/controllers/api/application_controller.rb.tt
37
39
  - lib/generators/authentication/templates/controllers/api/authentications/events_controller.rb.tt
38
40
  - lib/generators/authentication/templates/controllers/api/identity/email_verifications_controller.rb.tt
39
41
  - lib/generators/authentication/templates/controllers/api/identity/emails_controller.rb.tt
@@ -42,6 +44,7 @@ files:
42
44
  - lib/generators/authentication/templates/controllers/api/registrations_controller.rb.tt
43
45
  - lib/generators/authentication/templates/controllers/api/sessions/sudos_controller.rb.tt
44
46
  - lib/generators/authentication/templates/controllers/api/sessions_controller.rb.tt
47
+ - lib/generators/authentication/templates/controllers/html/application_controller.rb.tt
45
48
  - lib/generators/authentication/templates/controllers/html/authentications/events_controller.rb.tt
46
49
  - lib/generators/authentication/templates/controllers/html/identity/email_verifications_controller.rb.tt
47
50
  - lib/generators/authentication/templates/controllers/html/identity/emails_controller.rb.tt
@@ -76,6 +79,7 @@ files:
76
79
  - lib/generators/authentication/templates/models/locking.rb.tt
77
80
  - lib/generators/authentication/templates/models/model.rb.tt
78
81
  - lib/generators/authentication/templates/models/session.rb.tt
82
+ - lib/generators/authentication/templates/test_unit/application_system_test_case.rb.tt
79
83
  - lib/generators/authentication/templates/test_unit/controllers/api/identity/email_verifications_controller_test.rb.tt
80
84
  - lib/generators/authentication/templates/test_unit/controllers/api/identity/emails_controller_test.rb.tt
81
85
  - lib/generators/authentication/templates/test_unit/controllers/api/identity/password_resets_controller_test.rb.tt
@@ -97,6 +101,7 @@ files:
97
101
  - lib/generators/authentication/templates/test_unit/system/registrations_test.rb.tt
98
102
  - lib/generators/authentication/templates/test_unit/system/sessions/sudos_test.rb.tt
99
103
  - lib/generators/authentication/templates/test_unit/system/sessions_test.rb.tt
104
+ - lib/generators/authentication/templates/test_unit/test_helper.rb.tt
100
105
  homepage: https://github.com/lazaronixon/authentication-zero
101
106
  licenses:
102
107
  - MIT