tok 0.0.1.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/.rspec +3 -0
- data/.travis.yml +10 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +62 -0
- data/Rakefile +22 -0
- data/app/controllers/tok/base_controller.rb +11 -0
- data/app/controllers/tok/sessions_controller.rb +21 -0
- data/app/controllers/tok/users_controller.rb +14 -0
- data/config/routes.rb +5 -0
- data/db/migrate/20141011022222_create_users.rb +13 -0
- data/lib/generators/tok/install_generator.rb +55 -0
- data/lib/generators/tok/templates/migration/create_model.rb +13 -0
- data/lib/generators/tok/templates/model.rb +3 -0
- data/lib/generators/tok/templates/tok.rb +38 -0
- data/lib/tok.rb +19 -0
- data/lib/tok/authentication.rb +53 -0
- data/lib/tok/configuration.rb +41 -0
- data/lib/tok/controller.rb +64 -0
- data/lib/tok/engine.rb +26 -0
- data/lib/tok/version.rb +3 -0
- data/spec/controllers/sessions_controller_spec.rb +62 -0
- data/spec/controllers/users_controller_spec.rb +28 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/controllers/application_controller.rb +2 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +30 -0
- data/spec/dummy/config/boot.rb +4 -0
- data/spec/dummy/config/database.yml +85 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +28 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/secret_token.rb +19 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +13 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +56 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/schema.rb +29 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/lib/tasks/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/robots.txt +5 -0
- data/spec/factories/users.rb +6 -0
- data/spec/generators/install_generator_spec.rb +30 -0
- data/spec/routing/routes_spec.rb +57 -0
- data/spec/spec_helper.rb +30 -0
- data/spec/support/generator_helpers.rb +21 -0
- data/spec/support/json_helpers.rb +7 -0
- data/spec/tok/configuration_spec.rb +103 -0
- data/spec/tok/controller_spec.rb +24 -0
- data/tok.gemspec +32 -0
- metadata +279 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8f8d7c0073c47bf0076e05f6a2e5b0e8efc27969
|
4
|
+
data.tar.gz: 37421e1517b529672da047e6be6538916671b8e4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 94a39870d25f1817e861bf137e56df9b77c96cb3857426f805c7cb51af474064ddd99fc21eec39f63b5f8faba146f805c62a6a998b4b77215dd4ea539f6ad8a8
|
7
|
+
data.tar.gz: cec2214f4f1dafb913ab2bc24bb4622c67f25a8ecc62bbb16a5ed9fb408689ebabae96d9b7c2af52fa36bad62f2c95d2b7dc6dd821ef0e863da178795454c58a
|
data/.gitignore
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
/.bundle/
|
2
|
+
/.yardoc
|
3
|
+
/Gemfile.lock
|
4
|
+
/_yardoc/
|
5
|
+
/coverage/
|
6
|
+
/doc/
|
7
|
+
/pkg/
|
8
|
+
/spec/reports/
|
9
|
+
/spec/dummy/db/seeds.rb
|
10
|
+
/spec/dummy/db/migrate/*.rb
|
11
|
+
/spec/dummy/Gemfile
|
12
|
+
/spec/dummy/Gemfile.lock
|
13
|
+
/tmp/
|
14
|
+
*.bundle
|
15
|
+
*.so
|
16
|
+
*.o
|
17
|
+
*.a
|
18
|
+
mkmf.log
|
19
|
+
.ruby-version
|
20
|
+
.ruby-gemset
|
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Ahmed Hazem
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# Tok
|
2
|
+
|
3
|
+
No-frills token-based authentication for modern Rails applications.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Tok works with (and is tested against) Rails > 4.0. To install, add this line to your Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'tok'
|
11
|
+
```
|
12
|
+
|
13
|
+
Then run `bundle install`. You can always install the gem yourself by executing:
|
14
|
+
|
15
|
+
$ gem install tok
|
16
|
+
|
17
|
+
## Usage
|
18
|
+
|
19
|
+
First, run the generator by executing:
|
20
|
+
|
21
|
+
$ rails generate tok:install
|
22
|
+
|
23
|
+
The generator by default does the following:
|
24
|
+
|
25
|
+
- Inserts `Tok::Authentication` into `User` model (or creates one if not available)
|
26
|
+
- Inserts `Tok::Controller` into your `ApplicationController`
|
27
|
+
- Creates a number of default routes `signup`, `login`, and `logout`
|
28
|
+
- Creates an initializer at `config/initializers/tok.rb` to allow further configuration
|
29
|
+
|
30
|
+
A custom model can be specified by passing `--model` (or just `-m`) as an option to the generator:
|
31
|
+
|
32
|
+
$ rails generate tok:install -m Account
|
33
|
+
$ rails generate tok:install --model=Account
|
34
|
+
|
35
|
+
In this case, the generator will also create a migration in order to create a table with the specified model pluralized.
|
36
|
+
|
37
|
+
Next, run migrations by executing:
|
38
|
+
|
39
|
+
$ rake db:migrate
|
40
|
+
|
41
|
+
### Configure
|
42
|
+
|
43
|
+
To configure Tok, you can override defaults in your `config/initializers/tok.rb`. Be sure to check the initializer for further details into what values are used by default.
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
# Use the following configuration block to adjust Tok.
|
47
|
+
Tok.configure do |config|
|
48
|
+
config.model = Account
|
49
|
+
config.bcrypt_cost = 8
|
50
|
+
config.signup_route = "sign_up"
|
51
|
+
config.login_route = "sign_in"
|
52
|
+
config.logout_route = "sign_out"
|
53
|
+
end
|
54
|
+
```
|
55
|
+
|
56
|
+
## Contributing
|
57
|
+
|
58
|
+
1. Fork it ( https://github.com/[my-github-username]/tok/fork )
|
59
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
60
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
61
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
62
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
|
4
|
+
namespace :db do
|
5
|
+
desc "Migrate /spec/dummy app's database"
|
6
|
+
task :migrate do
|
7
|
+
`cd spec/dummy && rake db:migrate`
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Rollback /spec/dummy app's database"
|
11
|
+
task :rollback do
|
12
|
+
`cd spec/dummy && rake db:rollback`
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Reset /spec/dummy app's development and test databases"
|
16
|
+
task :reset do
|
17
|
+
`cd spec/dummy && rake db:drop && rake db:create`
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
RSpec::Core::RakeTask.new(:spec)
|
22
|
+
task :default => :spec
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Tok
|
2
|
+
class SessionsController < BaseController
|
3
|
+
# POST /login
|
4
|
+
def create
|
5
|
+
@model = model_class.authenticate(model_params)
|
6
|
+
|
7
|
+
if @model
|
8
|
+
render json: {token: @model.authentication_token}.to_json, status: :created
|
9
|
+
else
|
10
|
+
render json: {"error" => "Invalid email or password!"}.to_json, status: :unprocessable_entity
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# DELETE /logout
|
15
|
+
def destroy
|
16
|
+
current_user.reset_authentication_token if current_user
|
17
|
+
|
18
|
+
head :no_content
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Tok
|
2
|
+
class UsersController < BaseController
|
3
|
+
# POST /signup
|
4
|
+
def create
|
5
|
+
@model = model_class.new(model_params)
|
6
|
+
|
7
|
+
if @model.save
|
8
|
+
render json: @model, status: :created
|
9
|
+
else
|
10
|
+
render json: @model.errors, status: :unprocessable_entity
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateUsers < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :users do |t|
|
4
|
+
t.string :email, null: false
|
5
|
+
t.string :encrypted_password, null: false
|
6
|
+
t.string :authentication_token
|
7
|
+
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
|
11
|
+
add_index :users, :email, unique: true
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
require 'rails/generators/active_record'
|
3
|
+
|
4
|
+
module Tok
|
5
|
+
module Generators
|
6
|
+
class InstallGenerator < Rails::Generators::Base
|
7
|
+
include Rails::Generators::Migration
|
8
|
+
|
9
|
+
source_root File.expand_path("../templates", __FILE__)
|
10
|
+
|
11
|
+
class_option :model, type: :string, aliases: "-m", desc: "Specify a model different than User"
|
12
|
+
|
13
|
+
def copy_initializer
|
14
|
+
template "tok.rb", "config/initializers/tok.rb"
|
15
|
+
end
|
16
|
+
|
17
|
+
def include_tok_into_application_controller
|
18
|
+
inject_into_class "app/controllers/application_controller.rb", ApplicationController, " include Tok::Controller\n"
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_or_include_tok_in_model
|
22
|
+
if File.exists?("app/models/#{model_file}")
|
23
|
+
inject_into_file "app/models/#{model_file}", " include Tok::Authentication\n",
|
24
|
+
after: "class #{model_name.classify} < ActiveRecord::Base"
|
25
|
+
else
|
26
|
+
template "model.rb", "app/models/#{model_file}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_tok_migration
|
31
|
+
if options[:model]
|
32
|
+
migration_template "migration/create_model.rb", "db/migrate/create_#{options[:model].downcase.pluralize}.rb"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.next_migration_number(dir)
|
37
|
+
ActiveRecord::Generators::Base.next_migration_number(dir)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def model
|
43
|
+
options[:model].classify
|
44
|
+
end
|
45
|
+
|
46
|
+
def model_name
|
47
|
+
options[:model] || "user"
|
48
|
+
end
|
49
|
+
|
50
|
+
def model_file
|
51
|
+
"#{model_name.downcase}.rb"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Create<%= model.pluralize %> < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :<%= model.tableize %> do |t|
|
4
|
+
t.string :email, null: false
|
5
|
+
t.string :encrypted_password, null: false
|
6
|
+
t.string :authentication_token
|
7
|
+
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
|
11
|
+
add_index :<%= model.tableize %>, :email, unique: true
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Use the following configuration block to adjust Tok.
|
2
|
+
Tok.configure do |config|
|
3
|
+
# -- Model --
|
4
|
+
# If you used a model different than the already included `User` model, you
|
5
|
+
# have to specify the name of the model over here.
|
6
|
+
# Default: User
|
7
|
+
#
|
8
|
+
# config.model =
|
9
|
+
|
10
|
+
|
11
|
+
# -- Bcrypt Cost --
|
12
|
+
# The cost factor for Bcrypt, defines how many rounds a password should be
|
13
|
+
# hashed.
|
14
|
+
# Default: 10
|
15
|
+
#
|
16
|
+
# config.bcrypt_cost =
|
17
|
+
|
18
|
+
|
19
|
+
# -- Signup Route --
|
20
|
+
# The route to be used for handling creation of new users.
|
21
|
+
# Default: `signup`
|
22
|
+
#
|
23
|
+
# config.signup_route =
|
24
|
+
|
25
|
+
|
26
|
+
# -- Login Route --
|
27
|
+
# The route to be used for handling authentication.
|
28
|
+
# Default: `login`
|
29
|
+
#
|
30
|
+
# config.login_route =
|
31
|
+
|
32
|
+
|
33
|
+
# -- Logout Route --
|
34
|
+
# The route to be used for logging users out.
|
35
|
+
# Default: `logout`
|
36
|
+
#
|
37
|
+
# config.logout_route =
|
38
|
+
end
|
data/lib/tok.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'tok/engine'
|
2
|
+
require 'tok/configuration'
|
3
|
+
require 'tok/controller'
|
4
|
+
require 'tok/authentication'
|
5
|
+
require 'tok/version'
|
6
|
+
|
7
|
+
module Tok
|
8
|
+
def self.configuration
|
9
|
+
@configuration ||= Configuration.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.configuration=(config)
|
13
|
+
@configuration = config
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.configure
|
17
|
+
yield configuration
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Tok
|
2
|
+
module Authentication
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
attr_accessor :password
|
7
|
+
|
8
|
+
include Callbacks
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def authenticate(params)
|
13
|
+
model = self.where(email: params[:email]).first
|
14
|
+
model if model && BCrypt::Password.new(model.encrypted_password) == params[:password]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module Callbacks
|
19
|
+
extend ActiveSupport::Concern
|
20
|
+
|
21
|
+
included do
|
22
|
+
before_save :encrypt_password
|
23
|
+
before_create :ensure_authentication_token
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def reset_authentication_token
|
28
|
+
self.authentication_token = generate_authentication_token
|
29
|
+
self.save
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def encrypt_password
|
35
|
+
self.encrypted_password = encrypt(password) if password.present?
|
36
|
+
end
|
37
|
+
|
38
|
+
def encrypt(password)
|
39
|
+
BCrypt::Password.create(password, cost: Tok.configuration.bcrypt_cost)
|
40
|
+
end
|
41
|
+
|
42
|
+
def ensure_authentication_token
|
43
|
+
self.authentication_token = generate_authentication_token if authentication_token.blank?
|
44
|
+
end
|
45
|
+
|
46
|
+
def generate_authentication_token
|
47
|
+
loop do
|
48
|
+
random = SecureRandom.urlsafe_base64(nil, false)
|
49
|
+
break random unless self.class.exists?(authentication_token: random)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'bcrypt'
|
2
|
+
|
3
|
+
module Tok
|
4
|
+
class Configuration
|
5
|
+
attr_accessor :model,
|
6
|
+
:bcrypt_cost,
|
7
|
+
:signup_route,
|
8
|
+
:login_route,
|
9
|
+
:logout_route
|
10
|
+
|
11
|
+
def model
|
12
|
+
@model || ::User
|
13
|
+
end
|
14
|
+
|
15
|
+
def bcrypt_cost
|
16
|
+
if test_environment?
|
17
|
+
BCrypt::Engine::MIN_COST
|
18
|
+
else
|
19
|
+
@bcrypt_cost || BCrypt::Engine::DEFAULT_COST
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def signup_route
|
24
|
+
@signup_route || "signup"
|
25
|
+
end
|
26
|
+
|
27
|
+
def login_route
|
28
|
+
@login_route || "login"
|
29
|
+
end
|
30
|
+
|
31
|
+
def logout_route
|
32
|
+
@logout_route || "logout"
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def test_environment?
|
38
|
+
defined?(:Rails) && Rails.env.test?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|