cow_auth 0.3.0 → 0.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2ef0a48dce112adc6dfba038831d871c13a577f6
4
- data.tar.gz: 607ad6d1172eaba966ef85410cb706a5afc6b2e7
3
+ metadata.gz: c9b457d5e613359cad57b0ef426979f534089cc8
4
+ data.tar.gz: b11a6ac0f2852dbcf3b5215df6147c9133618d75
5
5
  SHA512:
6
- metadata.gz: 0f2e1bb17673d7c0cd102e00132054d59c73fa8e8381d67b1646f0a3ac9911c71be4baa35f9c82ef78c2a49f3293795360fac91698917ad6c1faf16da370ff8f
7
- data.tar.gz: c8886526b41df9a13cf605eb2d53fae28288505a50393f209bc97eb020cdfffbcec76d12da7cfc5b64adf578effdd89e476ca652091f7f5a970b38eecb10562b
6
+ metadata.gz: 780843129e5e37b30fc2ece5185392bd431ad5d9e48aaa761823922de61e5d15b16dd649accc845e2430d633c54272a8f8e746e56789c7a84c6c570243dc1b4f
7
+ data.tar.gz: 0c70f12f43f00e3d5dd1d1828f2212f8033f0ca98ac72a5c6b95c6249b2bab4ff488de87092353090bfe89fc4523d92118cc8fec9cf6533646cf4da42372e645
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # CowAuth
2
2
 
3
- The main goal of this gem is to provide API authentication for Rails (or Rails-like) web applications.
3
+ The main goal of this gem is to provide session and / or API authentication for Rails (or Rails-like) web applications.
4
4
 
5
5
  ## Installation
6
6
 
@@ -20,12 +20,14 @@ Or install it yourself as:
20
20
 
21
21
  ## Model
22
22
 
23
- Example Rails model generator command:
23
+ ### Generator (Example)
24
24
 
25
- $ bundle exec rails generate model user email:string sid:string encrypted_password:string first_name:string last_name:string sign_in_count:integer
25
+ $ bundle exec rails generate model user uuid:string:uniq email:string:uniq sid:string:uniq encrypted_password:string first_name:string last_name:string sign_in_count:integer is_approved:boolean is_deleted:boolean
26
+
27
+ ### Migration (Example)
26
28
 
27
29
  # Modified migration; includes indexes and other stuff you might not want.
28
- class CreateUsers < ActiveRecord::Migration[5.0]
30
+ class CreateUsers < ActiveRecord::Migration[5.1]
29
31
  def change
30
32
  create_table :users do |t|
31
33
  t.string :uuid, null: false
@@ -45,6 +47,12 @@ Example Rails model generator command:
45
47
  end
46
48
  end
47
49
 
50
+ ### Model Inheritance
51
+
52
+ class User < CowAuth::User
53
+ end
54
+
55
+
48
56
  ### Create User
49
57
 
50
58
  User.create! email: 'email', password: 'password'
@@ -112,13 +120,19 @@ Add the following lines in the controller(s) that you want to enforce authentica
112
120
 
113
121
  ## Token Authentication
114
122
 
123
+ ### Authenticate (Example)
124
+
125
+ curl -X POST -i --data-urlencode email=user@domain.tld --data-urlencode password=password https://api.domain.tld/v1/sessions
126
+
127
+ curl -X DELETE -i https://api.domain.tld/v1/sessions -H "Authorization: Token token=b5503c9b85b881f8b3ddbd82f511912cb5503c9b85b881f8b3ddbd82f511912c,sid=C3281846f3976809796f91cf6bbb35c53"
128
+
115
129
  ### Authenticated Request
116
130
 
117
131
  Note that token and sid are both required.
118
132
 
119
133
  Example GET:
120
134
 
121
- curl -X GET http://api.local.dev:3000/v1/test -i -H "Authorization: Token token=b5503c9b85b881f8b3ddbd82f511912c,sid=C3281846f3976809796f91cf6bbb35c53"
135
+ curl -X GET -i https://api.domain.tld/v1/test -H "Authorization: Token token=b5503c9b85b881f8b3ddbd82f511912cb5503c9b85b881f8b3ddbd82f511912c,sid=C3281846f3976809796f91cf6bbb35c53"
122
136
 
123
137
  ### Controllers
124
138
 
@@ -139,8 +153,7 @@ Add the following lines in the controller(s) that you want to enforce authentica
139
153
  private
140
154
 
141
155
  def user_not_authenticated(exception)
142
- @message = exception.message
143
- render 'errors/unauthorized', status: :unauthorized
156
+ render json: { error: exception.message }, status: :unauthorized
144
157
  end
145
158
  end
146
159
 
@@ -159,7 +172,13 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
159
172
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
160
173
 
161
174
  bundle exec gem build cow_auth.gemspec
162
- bundle exec gem install cow_auth-0.2.0.gem
175
+ bundle exec gem install cow_auth-0.1.0.gem
176
+
177
+ ### Notes
178
+
179
+ cow_auth> bundle exec gem build cow_auth.gemspec
180
+
181
+ app> bundle
163
182
 
164
183
  ## Contributing
165
184
 
data/cow_auth.gemspec CHANGED
@@ -4,25 +4,26 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'cow_auth/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = 'cow_auth'
8
- spec.version = CowAuth::VERSION
9
- spec.authors = ['Mickey Cowden']
10
- spec.email = ['mickey@vt.edu']
7
+ spec.name = 'cow_auth'
8
+ spec.version = CowAuth::VERSION
9
+ spec.authors = ['Mickey Cowden']
10
+ spec.email = ['mickey@vt.edu']
11
11
 
12
- spec.summary = 'Summary'
13
- spec.description = 'Description'
14
- spec.homepage = 'https://github.com/mickey13/cow_auth'
15
- spec.license = 'MIT'
12
+ spec.summary = 'Authentication gem'
13
+ spec.description = 'The main goal of this gem is to provide session and / or API authentication for Rails (or Rails-like) web applications.'
14
+ spec.homepage = 'https://github.com/mickey13/cow_auth'
15
+ spec.license = 'MIT'
16
16
 
17
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
- spec.bindir = 'exe'
19
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.add_development_dependency 'bundler', '~> 1.11'
23
- spec.add_development_dependency 'rake', '~> 10.0'
24
- spec.add_development_dependency 'minitest', '~> 5.0'
25
- # spec.add_runtime_dependency 'activesupport', '5.0.0.beta3'
26
- spec.add_runtime_dependency 'scrypt', '~> 2.1'
27
- # spec.add_runtime_dependency 'redis', '~> 3.2'
22
+ spec.required_ruby_version = '~> 2.3'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.14'
25
+ spec.add_development_dependency 'rake', '~> 12.0'
26
+ spec.add_development_dependency 'minitest', '~> 5.10'
27
+ spec.add_runtime_dependency 'active_model_serializers', '~> 0.10'
28
+ spec.add_runtime_dependency 'scrypt', '~> 3.0'
28
29
  end
@@ -1,4 +1,7 @@
1
1
  module CowAuth
2
2
  class NotAuthenticatedError < StandardError
3
3
  end
4
+
5
+ class RedisHandleMissingError < StandardError
6
+ end
4
7
  end
@@ -1,4 +1,4 @@
1
- require 'cow_auth/not_authenticated_error'
1
+ require 'cow_auth/exceptions'
2
2
 
3
3
  module CowAuth
4
4
  module SessionAuth
@@ -1,4 +1,4 @@
1
- require 'cow_auth/not_authenticated_error'
1
+ require 'cow_auth/exceptions'
2
2
 
3
3
  module CowAuth
4
4
  module SessionAuth
@@ -1,4 +1,4 @@
1
- require 'cow_auth/not_authenticated_error'
1
+ require 'cow_auth/exceptions'
2
2
 
3
3
  module CowAuth
4
4
  module TokenAuth
@@ -1,4 +1,5 @@
1
- require 'cow_auth/not_authenticated_error'
1
+ require 'cow_auth/user_serializer'
2
+ require 'cow_auth/exceptions'
2
3
 
3
4
  module CowAuth
4
5
  module TokenAuth
@@ -9,6 +10,7 @@ module CowAuth
9
10
  @user = User.find_by(email: params[:email])
10
11
  if @user.try(:authenticate, params[:password])
11
12
  @user.api_sign_in
13
+ render json: UserSerializer.new(@user), status: :ok
12
14
  else
13
15
  raise CowAuth::NotAuthenticatedError.new('Invalid user credentials.')
14
16
  end
data/lib/cow_auth/user.rb CHANGED
@@ -2,7 +2,6 @@ require 'scrypt'
2
2
 
3
3
  module CowAuth
4
4
  class User < ActiveRecord::Base
5
-
6
5
  after_initialize :generate_sid_if_necessary
7
6
 
8
7
  validates :email, presence: true
@@ -29,6 +28,7 @@ module CowAuth
29
28
  end
30
29
 
31
30
  def api_sign_in
31
+ User.assert_redis_handle_present
32
32
  $redis.set(self.redis_key, {
33
33
  auth_token: User.generate_auth_token,
34
34
  expires_at: User.generate_token_expires_at
@@ -36,6 +36,7 @@ module CowAuth
36
36
  end
37
37
 
38
38
  def api_sign_out
39
+ User.assert_redis_handle_present
39
40
  $redis.del(self.redis_key)
40
41
  end
41
42
 
@@ -45,7 +46,11 @@ module CowAuth
45
46
 
46
47
  def self.authenticate_from_token(sid, auth_token)
47
48
  api_key = User.fetch_api_key_from_redis(sid)
48
- if api_key.present? && api_key.key?(:auth_token) && api_key.key?(:expires_at) && api_key[:auth_token] == auth_token && api_key[:expires_at] > Time.zone.now
49
+ if api_key.present? &&
50
+ api_key.key?(:auth_token) &&
51
+ api_key.key?(:expires_at) &&
52
+ api_key[:auth_token] == auth_token &&
53
+ api_key[:expires_at] > Time.zone.now
49
54
  return User.find_by(sid: sid)
50
55
  end
51
56
  return nil
@@ -73,8 +78,13 @@ module CowAuth
73
78
  end
74
79
 
75
80
  def self.fetch_api_key_from_redis(sid)
81
+ User.assert_redis_handle_present
76
82
  api_key = $redis.get("user_#{sid}")
77
83
  return api_key.present? ? JSON.parse(api_key).try(:symbolize_keys) : nil
78
84
  end
85
+
86
+ def self.assert_redis_handle_present
87
+ raise CowAuth::RedisHandleMissingError.new('"$redis" handle not found.') unless $redis.present?
88
+ end
79
89
  end
80
90
  end
@@ -0,0 +1,7 @@
1
+ require 'active_model_serializers'
2
+
3
+ module CowAuth
4
+ class UserSerializer < ActiveModel::Serializer
5
+ attributes :email, :sid, :auth_token, :first_name, :last_name, :sign_in_count
6
+ end
7
+ end
@@ -1,3 +1,3 @@
1
1
  module CowAuth
2
- VERSION = '0.3.0'
2
+ VERSION = '0.4.0'
3
3
  end
data/lib/cow_auth.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'cow_auth/version'
2
2
  require 'cow_auth/user'
3
- require 'cow_auth/not_authenticated_error'
3
+ require 'cow_auth/exceptions'
4
4
  require 'cow_auth/session_auth/session_endpoints'
5
5
  require 'cow_auth/session_auth/authenticate_request'
6
6
  require 'cow_auth/token_auth/session_endpoints'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cow_auth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mickey Cowden
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-07-31 00:00:00.000000000 Z
11
+ date: 2017-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,57 +16,72 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.11'
19
+ version: '1.14'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.11'
26
+ version: '1.14'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '12.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '12.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '5.0'
47
+ version: '5.10'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '5.0'
54
+ version: '5.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: active_model_serializers
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.10'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.10'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: scrypt
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '2.1'
75
+ version: '3.0'
62
76
  type: :runtime
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '2.1'
69
- description: Description
82
+ version: '3.0'
83
+ description: The main goal of this gem is to provide session and / or API authentication
84
+ for Rails (or Rails-like) web applications.
70
85
  email:
71
86
  - mickey@vt.edu
72
87
  executables: []
@@ -84,12 +99,13 @@ files:
84
99
  - bin/setup
85
100
  - cow_auth.gemspec
86
101
  - lib/cow_auth.rb
87
- - lib/cow_auth/not_authenticated_error.rb
102
+ - lib/cow_auth/exceptions.rb
88
103
  - lib/cow_auth/session_auth/authenticate_request.rb
89
104
  - lib/cow_auth/session_auth/session_endpoints.rb
90
105
  - lib/cow_auth/token_auth/authenticate_request.rb
91
106
  - lib/cow_auth/token_auth/session_endpoints.rb
92
107
  - lib/cow_auth/user.rb
108
+ - lib/cow_auth/user_serializer.rb
93
109
  - lib/cow_auth/version.rb
94
110
  homepage: https://github.com/mickey13/cow_auth
95
111
  licenses:
@@ -101,9 +117,9 @@ require_paths:
101
117
  - lib
102
118
  required_ruby_version: !ruby/object:Gem::Requirement
103
119
  requirements:
104
- - - ">="
120
+ - - "~>"
105
121
  - !ruby/object:Gem::Version
106
- version: '0'
122
+ version: '2.3'
107
123
  required_rubygems_version: !ruby/object:Gem::Requirement
108
124
  requirements:
109
125
  - - ">="
@@ -111,8 +127,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
127
  version: '0'
112
128
  requirements: []
113
129
  rubyforge_project:
114
- rubygems_version: 2.6.6
130
+ rubygems_version: 2.6.11
115
131
  signing_key:
116
132
  specification_version: 4
117
- summary: Summary
133
+ summary: Authentication gem
118
134
  test_files: []