authentication-zero 0.0.12 → 0.0.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +29 -0
- data/lib/authentication_zero/version.rb +1 -1
- data/lib/generators/authentication/authentication_generator.rb +6 -3
- data/lib/generators/authentication/templates/controllers/api/emails_controller.rb.tt +22 -0
- data/lib/generators/authentication/templates/controllers/api/password_resets_controller.rb.tt +3 -4
- data/lib/generators/authentication/templates/controllers/api/passwords_controller.rb.tt +2 -2
- data/lib/generators/authentication/templates/controllers/api/sessions_controller.rb.tt +2 -2
- data/lib/generators/authentication/templates/controllers/html/emails_controller.rb.tt +25 -0
- data/lib/generators/authentication/templates/controllers/html/password_resets_controller.rb.tt +4 -5
- data/lib/generators/authentication/templates/controllers/html/passwords_controller.rb.tt +2 -3
- data/lib/generators/authentication/templates/controllers/html/registrations_controller.rb.tt +1 -1
- data/lib/generators/authentication/templates/controllers/html/sessions_controller.rb.tt +2 -2
- data/lib/generators/authentication/templates/mailers/email_mailer.rb.tt +6 -0
- data/lib/generators/authentication/templates/mailers/password_mailer.rb.tt +4 -0
- data/lib/generators/authentication/templates/models/resource.rb.tt +25 -4
- data/lib/generators/authentication/templates/views/email_mailer/changed.html.erb.tt +11 -0
- data/lib/generators/authentication/templates/views/email_mailer/changed.text.erb.tt +9 -0
- data/lib/generators/authentication/templates/views/emails/edit.html.erb.tt +37 -0
- data/lib/generators/authentication/templates/views/password_mailer/changed.html.erb.tt +7 -0
- data/lib/generators/authentication/templates/views/password_mailer/changed.text.erb.tt +5 -0
- data/lib/generators/authentication/templates/views/password_mailer/reset.html.erb.tt +1 -1
- data/lib/generators/authentication/templates/views/password_mailer/reset.text.erb.tt +1 -1
- data/lib/generators/authentication/templates/views/password_resets/edit.html.erb.tt +1 -1
- data/lib/generators/authentication/templates/views/password_resets/new.html.erb.tt +1 -1
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99e38209d9e08d15cc9edabeb10704f340f5b903f3e6582119c0c086f7a821b0
|
4
|
+
data.tar.gz: 7c0c7c3fdc4d858f30df3f48aabb0ae73f7d175c04ef6babdb9ae3f458bceb4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 499be6541793f23e314a7e82fcee557d0bb84430d55dccf200ec7cffaf761fabd9d6783293f5a257485105f6484d023b757012753c7a0d9f80830346eb4ce9c5
|
7
|
+
data.tar.gz: 66da6b4184558ede3a23aa294aa7b9f09b52bd7e4ed5ecc90d2e9ab62e6c109d82fa095472b74284e00112ab391950c6925cb2ab7693f0606bcbbde7e23d49a6
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -2,6 +2,31 @@
|
|
2
2
|
|
3
3
|
The purpose of authentication zero is to generate a pre-built authentication system into a rails application (web or api-only) that follows both security and rails best practices. By generating code into the user's application instead of using a library, the user has complete freedom to modify the authentication system so it works best with their app.
|
4
4
|
|
5
|
+
## Features
|
6
|
+
|
7
|
+
- Sign up
|
8
|
+
- Email and password validations
|
9
|
+
- Reset the user password and send reset instructions
|
10
|
+
- Authentication by cookie (html)
|
11
|
+
- Authentication by token (api)
|
12
|
+
- Remember me (html)
|
13
|
+
- Send e-mail when email is changed
|
14
|
+
- Send e-mail when password is changed
|
15
|
+
- Cancel my account
|
16
|
+
- Log out
|
17
|
+
|
18
|
+
## Security and best practices
|
19
|
+
|
20
|
+
- [Current attributes](https://api.rubyonrails.org/classes/ActiveSupport/CurrentAttributes.html): Abstract super class that provides a thread-isolated attributes singleton, which resets automatically before and after each request.
|
21
|
+
- [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.
|
22
|
+
- [has_secure_token](https://api.rubyonrails.org/classes/ActiveRecord/SecureToken/ClassMethods.html#method-i-has_secure_token): Adds methods to generate unique tokens.
|
23
|
+
- [signed_id](https://api.rubyonrails.org/classes/ActiveRecord/SignedId.html): Returns a signed id that is tamper proof, so it's safe to send in an email or otherwise share with the outside world.
|
24
|
+
- [Signed cookies](https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html): Returns a jar that'll automatically generate a signed representation of cookie value and verify it when reading from the cookie again.
|
25
|
+
- [Http only cookies](https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html): A cookie with the httponly attribute is inaccessible to the JavaScript, this precaution helps mitigate cross-site scripting (XSS) attacks.
|
26
|
+
- [Log filtering](https://guides.rubyonrails.org/action_controller_overview.html#log-filtering): Parameters 'token' and 'password' are marked [FILTERED] in the log.
|
27
|
+
- [Callbacks](https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html): We use callbacks to send emails before changing an email or password.
|
28
|
+
- [Action mailer](https://api.rubyonrails.org/classes/ActionMailer/Base.html): Action Mailer allows you to send email from your application using a mailer model and views.
|
29
|
+
|
5
30
|
## Installation
|
6
31
|
|
7
32
|
Add this lines to your application's Gemfile:
|
@@ -30,6 +55,10 @@ Add these lines to your `app/views/home/index.html.erb`:
|
|
30
55
|
|
31
56
|
<p>Signed as <%= Current.user.email %></p>
|
32
57
|
|
58
|
+
<div>
|
59
|
+
<%= link_to "Change email", edit_emails_path %>
|
60
|
+
</div>
|
61
|
+
|
33
62
|
<div>
|
34
63
|
<%= link_to "Change password", edit_passwords_path %>
|
35
64
|
</div>
|
@@ -16,11 +16,13 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def create_mailers
|
19
|
+
template "mailers/email_mailer.rb", "app/mailers/email_mailer.rb"
|
19
20
|
template "mailers/password_mailer.rb", "app/mailers/password_mailer.rb"
|
20
21
|
end
|
21
22
|
|
22
23
|
def create_views
|
23
24
|
if options.api
|
25
|
+
directory "views/email_mailer", "app/views/email_mailer"
|
24
26
|
directory "views/password_mailer", "app/views/password_mailer"
|
25
27
|
else
|
26
28
|
directory "views", "app/views"
|
@@ -39,7 +41,8 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
|
|
39
41
|
def add_routes
|
40
42
|
route "resource :password_resets, only: [:new, :edit, :create, :update]"
|
41
43
|
route "resource :cancellations, only: [:new, :create]"
|
42
|
-
route "resource :passwords, only: [:
|
44
|
+
route "resource :passwords, only: [:edit, :update]"
|
45
|
+
route "resource :emails, only: [:edit, :update]"
|
43
46
|
route "delete 'sign_out', to: 'sessions#destroy'"
|
44
47
|
route "post 'sign_up', to: 'registrations#create'"
|
45
48
|
route "get 'sign_up', to: 'registrations#new'" unless options.api?
|
@@ -56,7 +59,7 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
|
|
56
59
|
|
57
60
|
private
|
58
61
|
def authenticate
|
59
|
-
if #{singular_table_name} = authenticate_with_http_token { |
|
62
|
+
if #{singular_table_name} = authenticate_with_http_token { |t, _| #{class_name}.find_signed_session_token(t) }
|
60
63
|
Current.user = #{singular_table_name}
|
61
64
|
else
|
62
65
|
request_http_token_authentication
|
@@ -70,7 +73,7 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
|
|
70
73
|
|
71
74
|
private
|
72
75
|
def authenticate
|
73
|
-
if #{singular_table_name} =
|
76
|
+
if #{singular_table_name} = #{class_name}.find_by_session_token(cookies.signed[:session_token])
|
74
77
|
Current.user = #{singular_table_name}
|
75
78
|
else
|
76
79
|
redirect_to sign_in_path, alert: "You need to sign in or sign up before continuing"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class EmailsController < ApplicationController
|
2
|
+
before_action :set_<%= singular_table_name %>
|
3
|
+
|
4
|
+
def update
|
5
|
+
if !@<%= singular_table_name %>.authenticate(params[:current_password])
|
6
|
+
render json: { error: "The current password you entered is incorrect" }, status: :bad_request
|
7
|
+
elsif @<%= singular_table_name %>.update(<%= "#{singular_table_name}_params" %>)
|
8
|
+
render json: @<%= singular_table_name %>
|
9
|
+
else
|
10
|
+
render json: @<%= singular_table_name %>.errors, status: :unprocessable_entity
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def set_<%= singular_table_name %>
|
16
|
+
@<%= singular_table_name %> = Current.<%= singular_table_name %>
|
17
|
+
end
|
18
|
+
|
19
|
+
def <%= "#{singular_table_name}_params" %>
|
20
|
+
params.permit(:email)
|
21
|
+
end
|
22
|
+
end
|
data/lib/generators/authentication/templates/controllers/api/password_resets_controller.rb.tt
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
class PasswordResetsController < ApplicationController
|
2
2
|
skip_before_action :authenticate
|
3
|
-
|
4
3
|
before_action :set_<%= singular_table_name %>, only: %i[ edit update ]
|
5
4
|
|
6
5
|
def edit
|
@@ -16,7 +15,7 @@ class PasswordResetsController < ApplicationController
|
|
16
15
|
end
|
17
16
|
|
18
17
|
def update
|
19
|
-
if @<%= singular_table_name %>.update(
|
18
|
+
if @<%= singular_table_name %>.update(<%= "#{singular_table_name}_params" %>)
|
20
19
|
render json: @<%= singular_table_name %>
|
21
20
|
else
|
22
21
|
render json: @<%= singular_table_name %>.errors, status: :unprocessable_entity
|
@@ -25,12 +24,12 @@ class PasswordResetsController < ApplicationController
|
|
25
24
|
|
26
25
|
private
|
27
26
|
def set_<%= singular_table_name %>
|
28
|
-
@<%= singular_table_name %> = <%= class_name %>.find_signed!(params[:
|
27
|
+
@<%= singular_table_name %> = <%= class_name %>.find_signed!(params[:token], purpose: "password_reset")
|
29
28
|
rescue ActiveSupport::MessageVerifier::InvalidSignature
|
30
29
|
render json: { error: "Your token has expired, please request a new one" }, status: :bad_request
|
31
30
|
end
|
32
31
|
|
33
|
-
def
|
32
|
+
def <%= "#{singular_table_name}_params" %>
|
34
33
|
params.permit(:password, :password_confirmation)
|
35
34
|
end
|
36
35
|
end
|
@@ -4,7 +4,7 @@ class PasswordsController < ApplicationController
|
|
4
4
|
def update
|
5
5
|
if !@<%= singular_table_name %>.authenticate(params[:current_password])
|
6
6
|
render json: { error: "The current password you entered is incorrect" }, status: :bad_request
|
7
|
-
elsif @<%= singular_table_name %>.update(
|
7
|
+
elsif @<%= singular_table_name %>.update(<%= "#{singular_table_name}_params" %>)
|
8
8
|
render json: @<%= singular_table_name %>
|
9
9
|
else
|
10
10
|
render json: @<%= singular_table_name %>.errors, status: :unprocessable_entity
|
@@ -16,7 +16,7 @@ class PasswordsController < ApplicationController
|
|
16
16
|
@<%= singular_table_name %> = Current.<%= singular_table_name %>
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def <%= "#{singular_table_name}_params" %>
|
20
20
|
params.permit(:password, :password_confirmation)
|
21
21
|
end
|
22
22
|
end
|
@@ -5,9 +5,9 @@ class SessionsController < ApplicationController
|
|
5
5
|
@<%= singular_table_name %> = <%= class_name %>.find_by_email(params[:email])
|
6
6
|
|
7
7
|
if @<%= singular_table_name %>.try(:authenticate, params[:password])
|
8
|
-
render json: { session_token: @<%= singular_table_name %>.
|
8
|
+
render json: { session_token: @<%= singular_table_name %>.signed_session_token }
|
9
9
|
else
|
10
|
-
render json: { error: "Invalid
|
10
|
+
render json: { error: "Invalid email or password" }, status: :unauthorized
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class EmailsController < ApplicationController
|
2
|
+
before_action :set_<%= singular_table_name %>
|
3
|
+
|
4
|
+
def edit
|
5
|
+
end
|
6
|
+
|
7
|
+
def update
|
8
|
+
if !@<%= singular_table_name %>.authenticate(params[:current_password])
|
9
|
+
redirect_to edit_emails_path, alert: "The current password you entered is incorrect"
|
10
|
+
elsif @<%= singular_table_name %>.update(<%= "#{singular_table_name}_params" %>)
|
11
|
+
redirect_to root_path, notice: "Your email has been changed successfully"
|
12
|
+
else
|
13
|
+
render :edit, status: :unprocessable_entity
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def set_<%= singular_table_name %>
|
19
|
+
@<%= singular_table_name %> = Current.<%= singular_table_name %>
|
20
|
+
end
|
21
|
+
|
22
|
+
def <%= "#{singular_table_name}_params" %>
|
23
|
+
params.require(:<%= singular_table_name %>).permit(:email)
|
24
|
+
end
|
25
|
+
end
|
data/lib/generators/authentication/templates/controllers/html/password_resets_controller.rb.tt
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
class PasswordResetsController < ApplicationController
|
2
2
|
skip_before_action :authenticate
|
3
|
-
|
4
3
|
before_action :set_<%= singular_table_name %>, only: %i[ edit update ]
|
5
4
|
|
6
5
|
def new
|
@@ -14,12 +13,12 @@ class PasswordResetsController < ApplicationController
|
|
14
13
|
PasswordMailer.with(<%= singular_table_name %>: @<%= singular_table_name %>).reset.deliver_later
|
15
14
|
redirect_to sign_in_path, notice: "You will receive an email with instructions on how to reset your password in a few minutes"
|
16
15
|
else
|
17
|
-
redirect_to new_password_resets_path, alert: "The email address doesn't exist in our database"
|
16
|
+
redirect_to new_password_resets_path(email_hint: params[:email]), alert: "The email address doesn't exist in our database"
|
18
17
|
end
|
19
18
|
end
|
20
19
|
|
21
20
|
def update
|
22
|
-
if @<%= singular_table_name %>.update(
|
21
|
+
if @<%= singular_table_name %>.update(<%= "#{singular_table_name}_params" %>)
|
23
22
|
redirect_to sign_in_path, notice: "Your password was reset successfully. Please sign in"
|
24
23
|
else
|
25
24
|
render :edit, status: :unprocessable_entity
|
@@ -28,12 +27,12 @@ class PasswordResetsController < ApplicationController
|
|
28
27
|
|
29
28
|
private
|
30
29
|
def set_<%= singular_table_name %>
|
31
|
-
@<%= singular_table_name %> = <%= class_name %>.find_signed!(params[:
|
30
|
+
@<%= singular_table_name %> = <%= class_name %>.find_signed!(params[:token], purpose: "password_reset")
|
32
31
|
rescue ActiveSupport::MessageVerifier::InvalidSignature
|
33
32
|
redirect_to new_password_resets_path, alert: "Your token has expired, please request a new one"
|
34
33
|
end
|
35
34
|
|
36
|
-
def
|
35
|
+
def <%= "#{singular_table_name}_params" %>
|
37
36
|
params.require(:<%= singular_table_name %>).permit(:password, :password_confirmation)
|
38
37
|
end
|
39
38
|
end
|
@@ -2,13 +2,12 @@ class PasswordsController < ApplicationController
|
|
2
2
|
before_action :set_<%= singular_table_name %>
|
3
3
|
|
4
4
|
def edit
|
5
|
-
@<%= singular_table_name %> = Current.<%= singular_table_name %>
|
6
5
|
end
|
7
6
|
|
8
7
|
def update
|
9
8
|
if !@<%= singular_table_name %>.authenticate(params[:current_password])
|
10
9
|
redirect_to edit_passwords_path, alert: "The current password you entered is incorrect"
|
11
|
-
elsif @<%= singular_table_name %>.update(
|
10
|
+
elsif @<%= singular_table_name %>.update(<%= "#{singular_table_name}_params" %>)
|
12
11
|
redirect_to root_path, notice: "Your password has been changed successfully"
|
13
12
|
else
|
14
13
|
render :edit, status: :unprocessable_entity
|
@@ -20,7 +19,7 @@ class PasswordsController < ApplicationController
|
|
20
19
|
@<%= singular_table_name %> = Current.<%= singular_table_name %>
|
21
20
|
end
|
22
21
|
|
23
|
-
def
|
22
|
+
def <%= "#{singular_table_name}_params" %>
|
24
23
|
params.require(:<%= singular_table_name %>).permit(:password, :password_confirmation)
|
25
24
|
end
|
26
25
|
end
|
data/lib/generators/authentication/templates/controllers/html/registrations_controller.rb.tt
CHANGED
@@ -9,7 +9,7 @@ class RegistrationsController < ApplicationController
|
|
9
9
|
@<%= singular_table_name %> = <%= class_name %>.new(<%= "#{singular_table_name}_params" %>)
|
10
10
|
|
11
11
|
if @<%= singular_table_name %>.save
|
12
|
-
cookies[:session_token] = { value: @<%= singular_table_name %>.session_token, httponly: true }
|
12
|
+
cookies.signed[:session_token] = { value: @<%= singular_table_name %>.session_token, httponly: true }
|
13
13
|
redirect_to root_path, notice: "Welcome! You have signed up successfully"
|
14
14
|
else
|
15
15
|
render :new, status: :unprocessable_entity
|
@@ -10,9 +10,9 @@ class SessionsController < ApplicationController
|
|
10
10
|
|
11
11
|
if @<%= singular_table_name %>.try(:authenticate, params[:password])
|
12
12
|
if params[:remember_me] == "1"
|
13
|
-
cookies.permanent[:session_token] = { value: @<%= singular_table_name %>.session_token, httponly: true }
|
13
|
+
cookies.signed.permanent[:session_token] = { value: @<%= singular_table_name %>.session_token, httponly: true }
|
14
14
|
else
|
15
|
-
cookies[:session_token] = { value: @<%= singular_table_name %>.session_token, httponly: true }
|
15
|
+
cookies.signed[:session_token] = { value: @<%= singular_table_name %>.session_token, httponly: true }
|
16
16
|
end
|
17
17
|
|
18
18
|
redirect_to root_path, notice: "Signed in successfully"
|
@@ -1,4 +1,8 @@
|
|
1
1
|
class PasswordMailer < ApplicationMailer
|
2
|
+
def changed
|
3
|
+
mail to: params[:<%= singular_table_name %>].email
|
4
|
+
end
|
5
|
+
|
2
6
|
def reset
|
3
7
|
@signed_id = params[:<%= singular_table_name %>].signed_id(purpose: "password_reset", expires_in: 20.minutes)
|
4
8
|
mail to: params[:<%= singular_table_name %>].email
|
@@ -6,9 +6,30 @@ class <%= class_name %> < ApplicationRecord
|
|
6
6
|
validates :email, format: { with: /\A[^@\s]+@[^@\s]+\z/ }
|
7
7
|
validates_length_of :password, minimum: 8, allow_blank: true
|
8
8
|
|
9
|
-
before_validation
|
9
|
+
before_validation do
|
10
|
+
self.email = email.downcase.strip
|
11
|
+
end
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
after_update_commit do
|
14
|
+
if self.email_previously_changed?
|
15
|
+
EmailMailer.with(change: self.email_previous_change).changed.deliver_later
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
after_update_commit do
|
20
|
+
if self.password_digest_previously_changed?
|
21
|
+
PasswordMailer.with(<%= singular_table_name %>: self).changed.deliver_later
|
22
|
+
end
|
23
|
+
end
|
24
|
+
<% if options.api? -%>
|
25
|
+
def signed_session_token
|
26
|
+
self.class.signed_id_verifier.generate(session_token)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.find_signed_session_token(signed_session_token)
|
30
|
+
if session_token = signed_id_verifier.verified(signed_session_token)
|
31
|
+
find_by_session_token(session_token)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
<% end -%>
|
14
35
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<p>Hey there,</p>
|
2
|
+
|
3
|
+
<p>We just wanted to confirm that your email address has been updated.</p>
|
4
|
+
|
5
|
+
<p><strong>Before, it was: <%%= @previous_email %></strong></p>
|
6
|
+
|
7
|
+
<p><strong>Now it is set to: <%%= @current_email %></strong></p>
|
8
|
+
|
9
|
+
<hr>
|
10
|
+
|
11
|
+
<p>If you didn't make this change, someone else may have access to your account. If you think that may be the case, please reply to this email and our support team will help you out.</p>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Hey there,
|
2
|
+
|
3
|
+
We just wanted to confirm that your email address has been updated.
|
4
|
+
|
5
|
+
Before, it was: <%%= @previous_email %>
|
6
|
+
|
7
|
+
Now it is set to: <%%= @current_email %>
|
8
|
+
|
9
|
+
If you didn't make this change, someone else may have access to your account. If you think that may be the case, please reply to this email and our support team will help you out.
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<p style="color: red"><%%= alert %></p>
|
2
|
+
|
3
|
+
<h1>Change your email</h1>
|
4
|
+
|
5
|
+
<%%= form_with(model: @<%= model_resource_name %>, url: emails_path) do |form| %>
|
6
|
+
<%% if @<%= singular_table_name %>.errors.any? %>
|
7
|
+
<div style="color: red">
|
8
|
+
<h2><%%= pluralize(@<%= singular_table_name %>.errors.count, "error") %> prohibited this <%= singular_table_name %> from being saved:</h2>
|
9
|
+
|
10
|
+
<ul>
|
11
|
+
<%% @<%= singular_table_name %>.errors.each do |error| %>
|
12
|
+
<li><%%= error.full_message %></li>
|
13
|
+
<%% end %>
|
14
|
+
</ul>
|
15
|
+
</div>
|
16
|
+
<%% end %>
|
17
|
+
|
18
|
+
<div>
|
19
|
+
<%%= label_tag :current_password, nil, style: "display: block" %>
|
20
|
+
<%%= password_field_tag :current_password, nil, autofocus: true, autocomplete: "current-password" %>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<div>
|
24
|
+
<%%= form.label :email, "New email", style: "display: block" %>
|
25
|
+
<%%= form.email_field :email %>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<div>
|
29
|
+
<%%= form.submit "Save changes" %>
|
30
|
+
</div>
|
31
|
+
<%% end %>
|
32
|
+
|
33
|
+
<br>
|
34
|
+
|
35
|
+
<div>
|
36
|
+
<%%= link_to "Back", root_path %>
|
37
|
+
</div>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<p>Hey there,</p>
|
2
|
+
|
3
|
+
<p>We just wanted to confirm that your password has been updated.</p>
|
4
|
+
|
5
|
+
<hr>
|
6
|
+
|
7
|
+
<p>If you didn't make this change, someone else may have access to your account. If you think that may be the case, please reply to this email and our support team will help you out.</p>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
<p>Can't remember your password for <strong><%%= params[:<%= singular_table_name %>].email %></strong>? That's OK, it happens. Just hit the link below to set a new one.</p>
|
4
4
|
|
5
|
-
<p><%%= link_to "Reset my password", edit_password_resets_url(
|
5
|
+
<p><%%= link_to "Reset my password", edit_password_resets_url(token: @signed_id) %></p>
|
6
6
|
|
7
7
|
<p>If you did not request a password reset you can safely ignore this email, it expires in 20 minutes. Only someone with access to this email account can reset your password.</p>
|
8
8
|
|
@@ -2,7 +2,7 @@ Hey there,
|
|
2
2
|
|
3
3
|
Can't remember your password for <%%= params[:<%= singular_table_name %>].email %>? That's OK, it happens. Just hit the link below to set a new one.
|
4
4
|
|
5
|
-
[Reset my password]<%%= edit_password_resets_url(
|
5
|
+
[Reset my password]<%%= edit_password_resets_url(token: @signed_id) %>
|
6
6
|
|
7
7
|
If you did not request a password reset you can safely ignore this email, it expires in 20 minutes. Only someone with access to this email account can reset your password.
|
8
8
|
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<%%= form_with(url: password_resets_path) do |form| %>
|
6
6
|
<div>
|
7
7
|
<%%= form.label :email, style: "display: block" %>
|
8
|
-
<%%= form.email_field :email, autofocus: true, required: true %>
|
8
|
+
<%%= form.email_field :email, value: params[:email_hint], autofocus: true, required: true %>
|
9
9
|
</div>
|
10
10
|
|
11
11
|
<div>
|
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: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nixon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-02-
|
11
|
+
date: 2022-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -32,20 +32,28 @@ files:
|
|
32
32
|
- lib/generators/authentication/USAGE
|
33
33
|
- lib/generators/authentication/authentication_generator.rb
|
34
34
|
- lib/generators/authentication/templates/controllers/api/cancellations_controller.rb.tt
|
35
|
+
- lib/generators/authentication/templates/controllers/api/emails_controller.rb.tt
|
35
36
|
- lib/generators/authentication/templates/controllers/api/password_resets_controller.rb.tt
|
36
37
|
- lib/generators/authentication/templates/controllers/api/passwords_controller.rb.tt
|
37
38
|
- lib/generators/authentication/templates/controllers/api/registrations_controller.rb.tt
|
38
39
|
- lib/generators/authentication/templates/controllers/api/sessions_controller.rb.tt
|
39
40
|
- lib/generators/authentication/templates/controllers/html/cancellations_controller.rb.tt
|
41
|
+
- lib/generators/authentication/templates/controllers/html/emails_controller.rb.tt
|
40
42
|
- lib/generators/authentication/templates/controllers/html/password_resets_controller.rb.tt
|
41
43
|
- lib/generators/authentication/templates/controllers/html/passwords_controller.rb.tt
|
42
44
|
- lib/generators/authentication/templates/controllers/html/registrations_controller.rb.tt
|
43
45
|
- lib/generators/authentication/templates/controllers/html/sessions_controller.rb.tt
|
46
|
+
- lib/generators/authentication/templates/mailers/email_mailer.rb.tt
|
44
47
|
- lib/generators/authentication/templates/mailers/password_mailer.rb.tt
|
45
48
|
- lib/generators/authentication/templates/migration.rb.tt
|
46
49
|
- lib/generators/authentication/templates/models/current.rb.tt
|
47
50
|
- lib/generators/authentication/templates/models/resource.rb.tt
|
48
51
|
- lib/generators/authentication/templates/views/cancellations/new.html.erb.tt
|
52
|
+
- lib/generators/authentication/templates/views/email_mailer/changed.html.erb.tt
|
53
|
+
- lib/generators/authentication/templates/views/email_mailer/changed.text.erb.tt
|
54
|
+
- lib/generators/authentication/templates/views/emails/edit.html.erb.tt
|
55
|
+
- lib/generators/authentication/templates/views/password_mailer/changed.html.erb.tt
|
56
|
+
- lib/generators/authentication/templates/views/password_mailer/changed.text.erb.tt
|
49
57
|
- lib/generators/authentication/templates/views/password_mailer/reset.html.erb.tt
|
50
58
|
- lib/generators/authentication/templates/views/password_mailer/reset.text.erb.tt
|
51
59
|
- lib/generators/authentication/templates/views/password_resets/edit.html.erb.tt
|