action_auth 0.1.0 → 0.1.1

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +0 -0
  3. data/README.md +18 -11
  4. data/Rakefile +0 -0
  5. data/app/assets/config/action_auth_manifest.js +0 -0
  6. data/app/assets/stylesheets/action_auth/application.css +0 -0
  7. data/app/controllers/action_auth/application_controller.rb +0 -0
  8. data/app/controllers/action_auth/passwords_controller.rb +26 -0
  9. data/app/controllers/action_auth/registrations_controller.rb +30 -0
  10. data/app/controllers/action_auth/sessions_controller.rb +27 -0
  11. data/app/helpers/action_auth/application_helper.rb +0 -0
  12. data/app/jobs/action_auth/application_job.rb +0 -0
  13. data/app/mailers/action_auth/application_mailer.rb +0 -0
  14. data/app/mailers/action_auth/user_mailer.rb +17 -0
  15. data/app/models/action_auth/application_record.rb +0 -0
  16. data/app/models/action_auth/current.rb +12 -0
  17. data/app/models/action_auth/session.rb +10 -0
  18. data/app/models/action_auth/user.rb +30 -0
  19. data/app/views/action_auth/passwords/edit.html.erb +43 -0
  20. data/app/views/action_auth/registrations/new.html.erb +35 -0
  21. data/app/views/action_auth/sessions/index.html.erb +29 -0
  22. data/app/views/action_auth/sessions/new.html.erb +30 -0
  23. data/app/views/action_auth/user_mailer/email_verification.html.erb +11 -0
  24. data/app/views/action_auth/user_mailer/email_verification.text.erb +3 -0
  25. data/app/views/action_auth/user_mailer/password_reset.html.erb +11 -0
  26. data/app/views/action_auth/user_mailer/password_reset.text.erb +3 -0
  27. data/app/views/layouts/action_auth/application.html.erb +0 -0
  28. data/app/views/layouts/action_auth/mailer.html.erb +13 -0
  29. data/app/views/layouts/action_auth/mailer.text.erb +1 -0
  30. data/config/routes.rb +6 -0
  31. data/db/migrate/20231107165548_create_action_auth_users.rb +12 -0
  32. data/db/migrate/20231107170349_create_action_auth_sessions.rb +11 -0
  33. data/lib/action_auth/controllers/helpers.rb +29 -0
  34. data/lib/action_auth/engine.rb +15 -0
  35. data/lib/action_auth/routing/helpers.rb +21 -0
  36. data/lib/action_auth/version.rb +1 -1
  37. data/lib/action_auth.rb +2 -1
  38. data/lib/tasks/action_auth_tasks.rake +0 -0
  39. metadata +37 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6c7b9bf432371c7d2d5dce29f8b5e8946064206ef58f6116bd0b66335dbe8061
4
- data.tar.gz: 24d15513648b56084857a68f2f25b61c29a29d63a66e29b1251e8b48a2d2c04d
3
+ metadata.gz: 45ce58405d5a45e6c9bf204378b2d187b468285401d889fe9e8323ce9649e345
4
+ data.tar.gz: 1e94b9b8e23d211d93ce96f8ff1e4ea1f6b816ca0ed9de8144b72a03273a7de7
5
5
  SHA512:
6
- metadata.gz: d5327306545b7798deb20118f940cd2eeff5769f6dec72a4da626264c7e255da0ad715ee87f0dd530314c1d02371a7b53f3a13e6af763256bae6db070f13b8f9
7
- data.tar.gz: 22225ffdaa9e1f0115e461d4b2363f84db5484d1338f84cb49a29ecfccb5085d17fb213705a77114a3fe4ffc2ec9761073078132d6f50ae5c2458f2060e7ad31
6
+ metadata.gz: 889f0be20c9e05507bfa12035ce2c06254b751161191bf3e1ae99eaba39643bbbb7b995a94b74dc4ba6453350e8201ae5265f938caaf50a85a149eae975e9a30
7
+ data.tar.gz: caecc465fce527d29225ab23ef7cc33c6cd992496864e5a224ab426a3a81378c2290a020b83dff6053c2f159d4bf9d8c579b9033ab48db8990b4796bacd024ab
data/MIT-LICENSE CHANGED
File without changes
data/README.md CHANGED
@@ -5,21 +5,28 @@ This is a placeholder for the ActionAuth gem. It is not yet ready for use.
5
5
  Add this line to your application's Gemfile:
6
6
 
7
7
  ```ruby
8
- gem "action_auth"
8
+ bundle add action_auth
9
+ bin/rails action_auth:install:migrations
9
10
  ```
11
+ ## Usage
10
12
 
11
- And then execute:
12
- ```bash
13
- $ bundle
14
- ```
13
+ ### Routes
15
14
 
16
- Or install it yourself as:
17
- ```bash
18
- $ gem install action_auth
19
- ```
15
+ Within your application, you'll have access to these routes. They have been styled to be consistent with Devise.
16
+
17
+ Method Verb Params Description
18
+ user_sessions_path GET Device session management
19
+ user_session_path DELETE [:id] Log Out
20
+ new_user_session_path GET Log in
21
+ new_user_registration_path GET Sign Up
22
+
23
+ ### Helper Methods
24
+
25
+ Method Description
26
+ current_user Returns the currently logged in user
27
+ user_signed_in? Returns true if the user is logged in
28
+ current_session Returns the current session
20
29
 
21
- ## Contributing
22
- Contribution directions go here.
23
30
 
24
31
  ## License
25
32
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile CHANGED
File without changes
File without changes
File without changes
@@ -0,0 +1,26 @@
1
+ module ActionAuth
2
+ class PasswordsController < ApplicationController
3
+ before_action :set_user
4
+
5
+ def edit
6
+ end
7
+
8
+ def update
9
+ if @user.update(user_params)
10
+ redirect_to root_path, notice: "Your password has been changed"
11
+ else
12
+ render :edit, status: :unprocessable_entity
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def set_user
19
+ @user = Current.user
20
+ end
21
+
22
+ def user_params
23
+ params.permit(:password, :password_confirmation, :password_challenge).with_defaults(password_challenge: "")
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ module ActionAuth
2
+ class RegistrationsController < ApplicationController
3
+ def new
4
+ @user = User.new
5
+ end
6
+
7
+ def create
8
+ @user = User.new(user_params)
9
+
10
+ if @user.save!
11
+ session_record = @user.action_auth_sessions.create!
12
+ cookies.signed.permanent[:session_token] = { value: session_record.id, httponly: true }
13
+
14
+ send_email_verification
15
+ redirect_to main_app.root_path, notice: "Welcome! You have signed up successfully"
16
+ else
17
+ render :new, status: :unprocessable_entity
18
+ end
19
+ end
20
+
21
+ private
22
+ def user_params
23
+ params.permit(:email, :password, :password_confirmation)
24
+ end
25
+
26
+ def send_email_verification
27
+ UserMailer.with(user: @user).email_verification.deliver_later
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,27 @@
1
+ module ActionAuth
2
+ class SessionsController < ApplicationController
3
+ before_action :set_current_request_details
4
+ def index
5
+ @sessions = Current.user.action_auth_sessions.order(created_at: :desc)
6
+ end
7
+
8
+ def new
9
+ end
10
+
11
+ def create
12
+ if user = User.authenticate_by(email: params[:email], password: params[:password])
13
+ @session = user.action_auth_sessions.create
14
+ cookies.signed.permanent[:session_token] = { value: @session.id, httponly: true }
15
+ redirect_to main_app.root_path, notice: "Signed in successfully"
16
+ else
17
+ redirect_to sign_in_path(email_hint: params[:email]), alert: "That email or password is incorrect"
18
+ end
19
+ end
20
+
21
+ def destroy
22
+ session = Current.user.action_auth_sessions.find(params[:id])
23
+ session.destroy
24
+ redirect_to(main_app.root_path, notice: "That session has been logged out")
25
+ end
26
+ end
27
+ end
File without changes
File without changes
File without changes
@@ -0,0 +1,17 @@
1
+ module ActionAuth
2
+ class UserMailer < ApplicationMailer
3
+ def password_reset
4
+ @user = params[:user]
5
+ @signed_id = @user.generate_token_for(:password_reset)
6
+
7
+ mail to: @user.email, subject: "Reset your password"
8
+ end
9
+
10
+ def email_verification
11
+ @user = params[:user]
12
+ @signed_id = @user.generate_token_for(:email_verification)
13
+
14
+ mail to: @user.email, subject: "Verify your email"
15
+ end
16
+ end
17
+ end
File without changes
@@ -0,0 +1,12 @@
1
+ module ActionAuth
2
+ class Current < ActiveSupport::CurrentAttributes
3
+ attribute :session
4
+ attribute :user_agent, :ip_address
5
+
6
+ delegate :action_auth_user, to: :session, allow_nil: true
7
+
8
+ def user
9
+ action_auth_user
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module ActionAuth
2
+ class Session < ApplicationRecord
3
+ belongs_to :action_auth_user, class_name: "ActionAuth::User", foreign_key: "action_auth_user_id"
4
+
5
+ before_create do
6
+ self.user_agent = Current.user_agent
7
+ self.ip_address = Current.ip_address
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,30 @@
1
+ module ActionAuth
2
+ class User < ApplicationRecord
3
+ has_secure_password
4
+
5
+ generates_token_for :email_verification, expires_in: 2.days do
6
+ email
7
+ end
8
+
9
+ generates_token_for :password_reset, expires_in: 20.minutes do
10
+ password_salt.last(10)
11
+ end
12
+
13
+
14
+ has_many :action_auth_sessions, dependent: :destroy, class_name: "ActionAuth::Session", foreign_key: "action_auth_user_id"
15
+
16
+ validates :email, presence: true, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }
17
+ validates :password, allow_nil: true, length: { minimum: 12 }
18
+
19
+ normalizes :email, with: -> email { email.strip.downcase }
20
+
21
+
22
+ before_validation if: :email_changed?, on: :update do
23
+ self.verified = false
24
+ end
25
+
26
+ after_update if: :password_digest_previously_changed? do
27
+ action_auth_sessions.where.not(id: Current.session).delete_all
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,43 @@
1
+ <p style="color: red"><%= alert %></p>
2
+
3
+ <h1>Change your password</h1>
4
+
5
+ <%= form_with(url: password_path, method: :patch) do |form| %>
6
+ <% if @user.errors.any? %>
7
+ <div style="color: red">
8
+ <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
9
+
10
+ <ul>
11
+ <% @user.errors.each do |error| %>
12
+ <li><%= error.full_message %></li>
13
+ <% end %>
14
+ </ul>
15
+ </div>
16
+ <% end %>
17
+
18
+ <div>
19
+ <%= form.label :password_challenge, style: "display: block" %>
20
+ <%= form.password_field :password_challenge, required: true, autofocus: true, autocomplete: "current-password" %>
21
+ </div>
22
+
23
+ <div>
24
+ <%= form.label :password, "New password", style: "display: block" %>
25
+ <%= form.password_field :password, required: true, autocomplete: "new-password" %>
26
+ <div>12 characters minimum.</div>
27
+ </div>
28
+
29
+ <div>
30
+ <%= form.label :password_confirmation, "Confirm new password", style: "display: block" %>
31
+ <%= form.password_field :password_confirmation, required: true, autocomplete: "new-password" %>
32
+ </div>
33
+
34
+ <div>
35
+ <%= form.submit "Save changes" %>
36
+ </div>
37
+ <% end %>
38
+
39
+ <br>
40
+
41
+ <div>
42
+ <%= link_to "Back", root_path %>
43
+ </div>
@@ -0,0 +1,35 @@
1
+ <h1>Sign up</h1>
2
+
3
+ <%= form_with(url: sign_up_path) do |form| %>
4
+ <% if @user.errors.any? %>
5
+ <div style="color: red">
6
+ <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
7
+
8
+ <ul>
9
+ <% @user.errors.each do |error| %>
10
+ <li><%= error.full_message %></li>
11
+ <% end %>
12
+ </ul>
13
+ </div>
14
+ <% end %>
15
+
16
+ <div>
17
+ <%= form.label :email, style: "display: block" %>
18
+ <%= form.email_field :email, value: @user.email, required: true, autofocus: true, autocomplete: "email" %>
19
+ </div>
20
+
21
+ <div>
22
+ <%= form.label :password, style: "display: block" %>
23
+ <%= form.password_field :password, required: true, autocomplete: "new-password" %>
24
+ <div>12 characters minimum.</div>
25
+ </div>
26
+
27
+ <div>
28
+ <%= form.label :password_confirmation, style: "display: block" %>
29
+ <%= form.password_field :password_confirmation, required: true, autocomplete: "new-password" %>
30
+ </div>
31
+
32
+ <div>
33
+ <%= form.submit "Sign up" %>
34
+ </div>
35
+ <% end %>
@@ -0,0 +1,29 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <h1>Devices & Sessions</h1>
4
+
5
+ <div id="sessions">
6
+ <% @sessions.each do |session| %>
7
+ <div id="<%= dom_id session %>">
8
+ <p>
9
+ <strong>User Agent:</strong>
10
+ <%= session.user_agent %>
11
+ </p>
12
+
13
+ <p>
14
+ <strong>Ip Address:</strong>
15
+ <%= session.ip_address %>
16
+ </p>
17
+
18
+ <p>
19
+ <strong>Created at:</strong>
20
+ <%= session.created_at %>
21
+ </p>
22
+
23
+ </div>
24
+ <p>
25
+ <%= button_to "Log out", session, method: :delete %>
26
+ </p>
27
+ <% end %>
28
+ </div>
29
+
@@ -0,0 +1,30 @@
1
+ <p style="color: green"><%= notice %></p>
2
+ <p style="color: red"><%= alert %></p>
3
+
4
+ <h1>Sign in</h1>
5
+
6
+ <%= form_with(url: sign_in_path) do |form| %>
7
+ <div>
8
+ <%= form.label :email, style: "display: block" %>
9
+ <%= form.email_field :email, value: params[:email_hint], required: true, autofocus: true, autocomplete: "email" %>
10
+ </div>
11
+
12
+ <div>
13
+ <%= form.label :password, style: "display: block" %>
14
+ <%= form.password_field :password, required: true, autocomplete: "current-password" %>
15
+ </div>
16
+
17
+ <div>
18
+ <%= form.submit "Sign in" %>
19
+ </div>
20
+ <% end %>
21
+
22
+ <br>
23
+
24
+
25
+ <br>
26
+
27
+ <div>
28
+ <%= link_to "Sign up", sign_up_path %> |
29
+ <%# link_to "Forgot your password?", new_identity_password_reset_path %>
30
+ </div>
@@ -0,0 +1,11 @@
1
+ <p>Hey there,</p>
2
+
3
+ <p>This is to confirm that <%= @user.email %> is the email you want to use on your account. If you ever lose your password, that's where we'll email a reset link.</p>
4
+
5
+ <p><strong>You must hit the link below to confirm that you received this email.</strong></p>
6
+
7
+ <p><%# link_to "Yes, use this email for my account", identity_email_verification_url(sid: @signed_id) %></p>
8
+
9
+ <hr>
10
+
11
+ <p>Have questions or need help? Just reply to this email and our support team will help you sort it out.</p>
@@ -0,0 +1,3 @@
1
+ User#email_verification
2
+
3
+ <%= @greeting %>, find me in app/views/action_auth/user_mailer/email_verification.text.erb
@@ -0,0 +1,11 @@
1
+ <p>Hey there,</p>
2
+
3
+ <p>Can't remember your password for <strong><%= @user.email %></strong>? That's OK, it happens. Just hit the link below to set a new one.</p>
4
+
5
+ <p><%# link_to "Reset my password", edit_identity_password_reset_url(sid: @signed_id) %></p>
6
+
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
+
9
+ <hr>
10
+
11
+ <p>Have questions or need help? Just reply to this email and our support team will help you sort it out.</p>
@@ -0,0 +1,3 @@
1
+ User#password_reset
2
+
3
+ <%= @greeting %>, find me in app/views/action_auth/user_mailer/password_reset.text.erb
File without changes
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <style>
6
+ /* Email styles need to be inline */
7
+ </style>
8
+ </head>
9
+
10
+ <body>
11
+ <%= yield %>
12
+ </body>
13
+ </html>
@@ -0,0 +1 @@
1
+ <%= yield %>
data/config/routes.rb CHANGED
@@ -1,2 +1,8 @@
1
1
  ActionAuth::Engine.routes.draw do
2
+ get "sign_in", to: "sessions#new"
3
+ post "sign_in", to: "sessions#create"
4
+ get "sign_up", to: "registrations#new"
5
+ post "sign_up", to: "registrations#create"
6
+ resources :sessions, only: [:index, :show, :destroy]
7
+ resource :password, only: [:edit, :update]
2
8
  end
@@ -0,0 +1,12 @@
1
+ class CreateActionAuthUsers < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :action_auth_users do |t|
4
+ t.string :email
5
+ t.string :password_digest
6
+ t.boolean :verified
7
+
8
+ t.timestamps
9
+ end
10
+ add_index :action_auth_users, :email, unique: true
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ class CreateActionAuthSessions < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :action_auth_sessions do |t|
4
+ t.references :action_auth_user, null: false, foreign_key: true
5
+ t.string :user_agent
6
+ t.string :ip_address
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ module ActionAuth
2
+ module Controllers
3
+ module Helpers
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_action :set_current_request_details
8
+
9
+ def current_user; Current.user; end
10
+ helper_method :current_user
11
+
12
+ def current_session; Current.session; end
13
+ helper_method :current_session
14
+
15
+ def user_signed_in?; Current.user.present?; end
16
+ helper_method :user_signed_in?
17
+
18
+ end
19
+
20
+ private
21
+
22
+ def set_current_request_details
23
+ Current.session = Session.find_by(id: cookies.signed[:session_token])
24
+ Current.user_agent = request.user_agent
25
+ Current.ip_address = request.ip
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,5 +1,20 @@
1
+ require 'action_auth/controllers/helpers'
2
+ require 'action_auth/routing/helpers'
3
+
1
4
  module ActionAuth
2
5
  class Engine < ::Rails::Engine
3
6
  isolate_namespace ActionAuth
7
+
8
+ ActiveSupport.on_load(:action_controller_base) do
9
+ include ActionAuth::Controllers::Helpers
10
+ include ActionAuth::Routing::Helpers
11
+ end
12
+
13
+ initializer 'action_auth.add_helpers' do |app|
14
+ ActiveSupport.on_load :action_controller_base do
15
+ helper_method :user_sessions_path, :user_session_path, :new_user_session_path
16
+ helper_method :new_user_registration_path
17
+ end
18
+ end
4
19
  end
5
20
  end
@@ -0,0 +1,21 @@
1
+ module ActionAuth
2
+ module Routing
3
+ module Helpers
4
+ def user_sessions_path
5
+ action_auth.sessions_path
6
+ end
7
+
8
+ def user_session_path(session_id)
9
+ action_auth.session_path(session_id)
10
+ end
11
+
12
+ def new_user_session_path
13
+ action_auth.sign_in_path
14
+ end
15
+
16
+ def new_user_registration_path
17
+ action_auth.sign_up_path
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
1
  module ActionAuth
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/lib/action_auth.rb CHANGED
@@ -2,5 +2,6 @@ require "action_auth/version"
2
2
  require "action_auth/engine"
3
3
 
4
4
  module ActionAuth
5
- # Your code goes here...
5
+ module Controllers
6
+ end
6
7
  end
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_auth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dave Kimura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-07 00:00:00.000000000 Z
11
+ date: 2023-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '7.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bcrypt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 3.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 3.1.0
27
41
  description: Using the built in features of Rails, ActionAuth provides a simple way
28
42
  to authorize users to perform actions on your application.
29
43
  email:
@@ -38,14 +52,35 @@ files:
38
52
  - app/assets/config/action_auth_manifest.js
39
53
  - app/assets/stylesheets/action_auth/application.css
40
54
  - app/controllers/action_auth/application_controller.rb
55
+ - app/controllers/action_auth/passwords_controller.rb
56
+ - app/controllers/action_auth/registrations_controller.rb
57
+ - app/controllers/action_auth/sessions_controller.rb
41
58
  - app/helpers/action_auth/application_helper.rb
42
59
  - app/jobs/action_auth/application_job.rb
43
60
  - app/mailers/action_auth/application_mailer.rb
61
+ - app/mailers/action_auth/user_mailer.rb
44
62
  - app/models/action_auth/application_record.rb
63
+ - app/models/action_auth/current.rb
64
+ - app/models/action_auth/session.rb
65
+ - app/models/action_auth/user.rb
66
+ - app/views/action_auth/passwords/edit.html.erb
67
+ - app/views/action_auth/registrations/new.html.erb
68
+ - app/views/action_auth/sessions/index.html.erb
69
+ - app/views/action_auth/sessions/new.html.erb
70
+ - app/views/action_auth/user_mailer/email_verification.html.erb
71
+ - app/views/action_auth/user_mailer/email_verification.text.erb
72
+ - app/views/action_auth/user_mailer/password_reset.html.erb
73
+ - app/views/action_auth/user_mailer/password_reset.text.erb
45
74
  - app/views/layouts/action_auth/application.html.erb
75
+ - app/views/layouts/action_auth/mailer.html.erb
76
+ - app/views/layouts/action_auth/mailer.text.erb
46
77
  - config/routes.rb
78
+ - db/migrate/20231107165548_create_action_auth_users.rb
79
+ - db/migrate/20231107170349_create_action_auth_sessions.rb
47
80
  - lib/action_auth.rb
81
+ - lib/action_auth/controllers/helpers.rb
48
82
  - lib/action_auth/engine.rb
83
+ - lib/action_auth/routing/helpers.rb
49
84
  - lib/action_auth/version.rb
50
85
  - lib/tasks/action_auth_tasks.rake
51
86
  homepage: https://www.github.com/kobaltz/action_auth