authentication-zero 0.0.5 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (24) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +1 -1
  4. data/lib/authentication_zero/version.rb +1 -1
  5. data/lib/generators/authentication/authentication_generator.rb +46 -18
  6. data/lib/generators/authentication/templates/controllers/api/cancellations_controller.rb.tt +5 -0
  7. data/lib/generators/authentication/templates/controllers/api/password_resets_controller.rb.tt +35 -0
  8. data/lib/generators/authentication/templates/controllers/api/passwords_controller.rb.tt +22 -0
  9. data/lib/generators/authentication/templates/controllers/api/registrations_controller.rb.tt +18 -0
  10. data/lib/generators/authentication/templates/controllers/api/sessions_controller.rb.tt +17 -0
  11. data/lib/generators/authentication/templates/controllers/html/cancellations_controller.rb.tt +0 -1
  12. data/lib/generators/authentication/templates/controllers/html/sessions_controller.rb.tt +0 -1
  13. data/lib/generators/authentication/templates/models/resource.rb.tt +4 -0
  14. data/lib/generators/authentication/templates/views/{html/cancellations → cancellations}/new.html.erb.tt +0 -0
  15. data/lib/generators/authentication/templates/views/password_mailer/reset.html.erb.tt +8 -0
  16. data/lib/generators/authentication/templates/views/password_mailer/reset.text.erb.tt +8 -0
  17. data/lib/generators/authentication/templates/views/{html/password_resets → password_resets}/edit.html.erb.tt +0 -0
  18. data/lib/generators/authentication/templates/views/{html/password_resets → password_resets}/new.html.erb.tt +1 -1
  19. data/lib/generators/authentication/templates/views/{html/passwords → passwords}/edit.html.erb.tt +0 -0
  20. data/lib/generators/authentication/templates/views/{html/registrations → registrations}/new.html.erb.tt +0 -0
  21. data/lib/generators/authentication/templates/views/{html/sessions → sessions}/new.html.erb.tt +0 -0
  22. metadata +14 -9
  23. data/lib/generators/authentication/templates/views/html/password_mailer/reset.html.erb.tt +0 -7
  24. data/lib/generators/authentication/templates/views/html/password_mailer/reset.text.erb.tt +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fbbdce3e39368908b25db1e2b98b1c6f7d8211c43099270f87e2d5905307033e
4
- data.tar.gz: be7a32894d05d9796a3baa46a6cf0907e3d0dc4808687c6238e8cda262c5edd3
3
+ metadata.gz: 11deb23576e389ac26590fa1028b8da52e874a1eb8be2578961816b2745a8b14
4
+ data.tar.gz: debebbdfe6829936c06b5ff8f2f2ba13f1d623b944ac65ff7a581070fd78d2ab
5
5
  SHA512:
6
- metadata.gz: e5db73d7da96f46cb79e4b2ea51fbd6d4698436ed234e50f535a7ad02b28f1cedbf1768d1b67d032ac070ac7bdec0ea7ab309141b9593a034497421f335f65b4
7
- data.tar.gz: 840de055d1877b02c0e52af876730bf5c1a87aafe99faf956f34e26736ecf0aa39907d86071b4956844e062f4a8f413ad83d4d4b30e773b5a5f111ff18729be1
6
+ metadata.gz: cb417c4b4e83690f092c28d3573718217fe3ab25ac605c1dbb0ee494289921c0d71dae1d1cf92b9a702339d5b108b702ed64ae7177aee49eb53fe24314da3e1a
7
+ data.tar.gz: 6869e7c3eb2775fbfcc90a75e97eb9bd6e30244452ef065e6da688a22d307d1f2f3c305b93b1ba4f157263b4d7a65ecb22e2c1f30e064ec9034e5a53788760ed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- authentication-zero (0.0.5)
4
+ authentication-zero (0.0.9)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Authentication Zero
2
2
 
3
- The purpose of authentication zero is to generate a pre-built authentication system into a rails application 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.
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
5
  ## Installation
6
6
 
@@ -1,3 +1,3 @@
1
1
  module AuthenticationZero
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -3,10 +3,16 @@ require "rails/generators/active_record"
3
3
  class AuthenticationGenerator < Rails::Generators::NamedBase
4
4
  include ActiveRecord::Generators::Migration
5
5
 
6
+ class_option :api, type: :boolean, desc: "Generates API authentication"
7
+
6
8
  source_root File.expand_path("templates", __dir__)
7
9
 
8
10
  def create_controllers
9
- directory "controllers/html", "app/controllers"
11
+ if options.api
12
+ directory "controllers/api", "app/controllers"
13
+ else
14
+ directory "controllers/html", "app/controllers"
15
+ end
10
16
  end
11
17
 
12
18
  def create_mailers
@@ -14,7 +20,11 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
14
20
  end
15
21
 
16
22
  def create_views
17
- directory "views/html", "app/views"
23
+ if options.api
24
+ directory "views/password_mailer", "app/views/password_mailer"
25
+ else
26
+ directory "views", "app/views"
27
+ end
18
28
  end
19
29
 
20
30
  def create_models
@@ -27,15 +37,15 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
27
37
  end
28
38
 
29
39
  def add_routes
30
- route "get 'sign_up', to: 'registrations#new'"
40
+ route "get 'sign_up', to: 'registrations#new'" unless options.api?
31
41
  route "post 'sign_up', to: 'registrations#create'"
32
- route "get 'sign_in', to: 'sessions#new'"
42
+ route "get 'sign_in', to: 'sessions#new'" unless options.api?
33
43
  route "post 'sign_in', to: 'sessions#create'"
34
- route "get 'password/edit', to: 'passwords#edit'"
44
+ route "get 'password/edit', to: 'passwords#edit'" unless options.api?
35
45
  route "patch 'password', to: 'passwords#update'"
36
- route "get 'cancellation/new', to: 'cancellations#new'"
46
+ route "get 'cancellation/new', to: 'cancellations#new'" unless options.api?
37
47
  route "post 'cancellation', to: 'cancellations#destroy'"
38
- route "get 'password_reset/new', to: 'password_resets#new'"
48
+ route "get 'password_reset/new', to: 'password_resets#new'" unless options.api?
39
49
  route "post 'password_reset', to: 'password_resets#create'"
40
50
  route "get 'password_reset/edit', to: 'password_resets#edit'"
41
51
  route "patch 'password_reset', to: 'password_resets#update'"
@@ -43,18 +53,36 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
43
53
  end
44
54
 
45
55
  def add_application_controller_methods
46
- inject_into_class "app/controllers/application_controller.rb", "ApplicationController", verbose: false do <<-CODE
47
- before_action :authenticate
48
-
49
- private
50
- def authenticate
51
- if #{singular_table_name} = cookies[:session_token] && #{class_name}.find_by_session_token(cookies[:session_token])
52
- Current.user = #{singular_table_name}
53
- else
54
- redirect_to sign_in_path, alert: "You need to sign in or sign up before continuing"
56
+ if options.api?
57
+ inject_into_class "app/controllers/application_controller.rb", "ApplicationController", verbose: false do <<~CODE
58
+ include ActionController::HttpAuthentication::Token::ControllerMethods
59
+
60
+ before_action :authenticate
61
+
62
+ private
63
+ def authenticate
64
+ if #{singular_table_name} = authenticate_with_http_token { |token, _| #{class_name}.find_by_session_token(token) }
65
+ Current.user = #{singular_table_name}
66
+ else
67
+ request_http_token_authentication
68
+ end
69
+ end
70
+ CODE
71
+ end
72
+ else
73
+ inject_into_class "app/controllers/application_controller.rb", "ApplicationController", verbose: false do <<~CODE
74
+ before_action :authenticate
75
+
76
+ private
77
+ def authenticate
78
+ if #{singular_table_name} = cookies[:session_token] && #{class_name}.find_by_session_token(cookies[:session_token])
79
+ Current.user = #{singular_table_name}
80
+ else
81
+ redirect_to sign_in_path, alert: "You need to sign in or sign up before continuing"
82
+ end
83
+ end
84
+ CODE
55
85
  end
56
- end
57
- CODE
58
86
  end
59
87
  end
60
88
  end
@@ -0,0 +1,5 @@
1
+ class CancellationsController < ApplicationController
2
+ def destroy
3
+ Current.<%= singular_table_name %>.destroy
4
+ end
5
+ end
@@ -0,0 +1,35 @@
1
+ class PasswordResetsController < ApplicationController
2
+ before_action :set_<%= singular_table_name %>, only: %i[ edit update ]
3
+ skip_before_action :authenticate
4
+
5
+ def edit
6
+ render json: { message: "Open this link in your device" }, status: :not_found
7
+ end
8
+
9
+ def create
10
+ if @<%= singular_table_name %> = <%= class_name %>.find_by_email(params[:email])
11
+ PasswordMailer.with(<%= singular_table_name %>: @<%= singular_table_name %>).reset.deliver_later
12
+ else
13
+ render json: { error: "The email address doesn't exist in our database" }, status: :bad_request
14
+ end
15
+ end
16
+
17
+ def update
18
+ if @<%= singular_table_name %>.update(password_params)
19
+ render json: @<%= singular_table_name %>
20
+ else
21
+ render json: @<%= singular_table_name %>.errors, status: :unprocessable_entity
22
+ end
23
+ end
24
+
25
+ private
26
+ def set_<%= singular_table_name %>
27
+ @<%= singular_table_name %> = <%= class_name %>.find_signed!(params[:token], purpose: "password_reset")
28
+ rescue ActiveSupport::MessageVerifier::InvalidSignature
29
+ render json: { error: "Your token has expired, please request a new one" }, status: :bad_request
30
+ end
31
+
32
+ def password_params
33
+ params.require(:<%= singular_table_name %>).permit(:password, :password_confirmation)
34
+ end
35
+ end
@@ -0,0 +1,22 @@
1
+ class PasswordsController < 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(password_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 password_params
20
+ params.require(:<%= singular_table_name %>).permit(:password, :password_confirmation)
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ class RegistrationsController < ApplicationController
2
+ skip_before_action :authenticate
3
+
4
+ def create
5
+ @<%= singular_table_name %> = <%= class_name %>.new(<%= "#{singular_table_name}_params" %>)
6
+
7
+ if @<%= singular_table_name %>.save
8
+ render json: @<%= singular_table_name %>, status: :created
9
+ else
10
+ render json: @<%= singular_table_name %>.errors, status: :unprocessable_entity
11
+ end
12
+ end
13
+
14
+ private
15
+ def <%= "#{singular_table_name}_params" %>
16
+ params.require(:<%= singular_table_name %>).permit(:email, :password, :password_confirmation)
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ class SessionsController < ApplicationController
2
+ skip_before_action :authenticate, except: :destroy
3
+
4
+ def create
5
+ @<%= singular_table_name %> = <%= class_name %>.find_by_email(params[:email])
6
+
7
+ if @<%= singular_table_name %>.try(:authenticate, params[:password])
8
+ render json: { session_token: @<%= singular_table_name %>.session_token }
9
+ else
10
+ render json: { error: "Invalid session token" }, status: :unauthorized
11
+ end
12
+ end
13
+
14
+ def destroy
15
+ Current.<%= singular_table_name %>.regenerate_session_token
16
+ end
17
+ end
@@ -4,7 +4,6 @@ class CancellationsController < ApplicationController
4
4
 
5
5
  def destroy
6
6
  Current.<%= singular_table_name %>.destroy
7
- cookies.delete :session_token
8
7
  redirect_to sign_in_path, notice: "Bye! Your account has been successfully cancelled"
9
8
  end
10
9
  end
@@ -22,7 +22,6 @@ class SessionsController < ApplicationController
22
22
  end
23
23
 
24
24
  def destroy
25
- cookies.delete :session_token
26
25
  Current.<%= singular_table_name %>.regenerate_session_token
27
26
  redirect_to sign_in_path, notice: "Signed out successfully"
28
27
  end
@@ -7,4 +7,8 @@ class <%= class_name %> < ApplicationRecord
7
7
  validates_length_of :password, minimum: 8, allow_blank: true
8
8
 
9
9
  before_validation { self.email = email.downcase.strip }
10
+
11
+ def as_json(options)
12
+ super(options.merge(except: [:password_digest, :session_token]))
13
+ end
10
14
  end
@@ -0,0 +1,8 @@
1
+ <p>Hello <%%= params[:<%= singular_table_name %>].email %>!</p>
2
+
3
+ <p>Someone has requested a link to change your password. You can do this through the link below.</p>
4
+
5
+ <p><%%= link_to "Change my password", password_reset_edit_url(token: @token) %></p>
6
+
7
+ <p>If you didn't request this, please ignore this email.</p>
8
+ <p>Your password won't change until you access the link above and create a new one.</p>
@@ -0,0 +1,8 @@
1
+ Hello <%%= params[:<%= singular_table_name %>].email %>
2
+
3
+ Someone has requested a link to change your password, and you can do this through the link below.
4
+
5
+ [Change my password]<%%= password_reset_edit_url(token: @token) %>
6
+
7
+ If you didn't request this, please ignore this email.
8
+ Your password won't change until you access the link above and create a new one.
@@ -5,7 +5,7 @@
5
5
  <%%= form_with(url: password_reset_path) do |form| %>
6
6
  <div>
7
7
  <%%= form.label :email, style: "display: block" %>
8
- <%%= form.email_field :email, autofocus: true, required: true, autocomplete: "email" %>
8
+ <%%= form.email_field :email, autofocus: true, required: true %>
9
9
  </div>
10
10
 
11
11
  <div>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authentication-zero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nixon
@@ -31,6 +31,11 @@ files:
31
31
  - lib/authentication_zero/version.rb
32
32
  - lib/generators/authentication/USAGE
33
33
  - lib/generators/authentication/authentication_generator.rb
34
+ - lib/generators/authentication/templates/controllers/api/cancellations_controller.rb.tt
35
+ - lib/generators/authentication/templates/controllers/api/password_resets_controller.rb.tt
36
+ - lib/generators/authentication/templates/controllers/api/passwords_controller.rb.tt
37
+ - lib/generators/authentication/templates/controllers/api/registrations_controller.rb.tt
38
+ - lib/generators/authentication/templates/controllers/api/sessions_controller.rb.tt
34
39
  - lib/generators/authentication/templates/controllers/html/cancellations_controller.rb.tt
35
40
  - lib/generators/authentication/templates/controllers/html/password_resets_controller.rb.tt
36
41
  - lib/generators/authentication/templates/controllers/html/passwords_controller.rb.tt
@@ -40,14 +45,14 @@ files:
40
45
  - lib/generators/authentication/templates/migration.rb.tt
41
46
  - lib/generators/authentication/templates/models/current.rb.tt
42
47
  - lib/generators/authentication/templates/models/resource.rb.tt
43
- - lib/generators/authentication/templates/views/html/cancellations/new.html.erb.tt
44
- - lib/generators/authentication/templates/views/html/password_mailer/reset.html.erb.tt
45
- - lib/generators/authentication/templates/views/html/password_mailer/reset.text.erb.tt
46
- - lib/generators/authentication/templates/views/html/password_resets/edit.html.erb.tt
47
- - lib/generators/authentication/templates/views/html/password_resets/new.html.erb.tt
48
- - lib/generators/authentication/templates/views/html/passwords/edit.html.erb.tt
49
- - lib/generators/authentication/templates/views/html/registrations/new.html.erb.tt
50
- - lib/generators/authentication/templates/views/html/sessions/new.html.erb.tt
48
+ - lib/generators/authentication/templates/views/cancellations/new.html.erb.tt
49
+ - lib/generators/authentication/templates/views/password_mailer/reset.html.erb.tt
50
+ - lib/generators/authentication/templates/views/password_mailer/reset.text.erb.tt
51
+ - lib/generators/authentication/templates/views/password_resets/edit.html.erb.tt
52
+ - lib/generators/authentication/templates/views/password_resets/new.html.erb.tt
53
+ - lib/generators/authentication/templates/views/passwords/edit.html.erb.tt
54
+ - lib/generators/authentication/templates/views/registrations/new.html.erb.tt
55
+ - lib/generators/authentication/templates/views/sessions/new.html.erb.tt
51
56
  homepage: https://github.com/lazaronixon/authentication-zero
52
57
  licenses:
53
58
  - MIT
@@ -1,7 +0,0 @@
1
- Hi <%%= params[:<%= singular_table_name %>].email %>,
2
-
3
- Someone requested a reset of your password.
4
-
5
- If this was you, click the link to reset your password. The link will expire automatically in 15 minutes.
6
-
7
- <%%= link_to "Reset password", password_reset_edit_url(token: @token) %>
@@ -1,7 +0,0 @@
1
- Hi <%%= params[:<%= singular_table_name %>].email %>,
2
-
3
- Someone requested a reset of your password.
4
-
5
- If this was you, click the link to reset your password. The link will expire automatically in 15 minutes.
6
-
7
- <%%= password_reset_edit_url(token: @token) %>