morpho 0.3.1 → 0.3.2

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
  SHA256:
3
- metadata.gz: a5e58a85aef299825d478036742e688fc13a9ddc8233387bd5e708fdf8fc3c59
4
- data.tar.gz: 899df45d8f131d02d9899a9624abd22ff3eb4138a971954cca56d63f0ea919c4
3
+ metadata.gz: c5c49b67969b1ac0960d6430694b709177b68968887b32906304f5e0f02ee830
4
+ data.tar.gz: ac874025f16e322d8846dd11ca252cf80719eb0717c98879a813188daecd473b
5
5
  SHA512:
6
- metadata.gz: ffc548ba4bf67699b99e377e6590dec5afc2e234f7c6bd20ea27d721cc08e489b5482eedc4b74c1404c9f5dcc79319c644cf9396f71e2069d213621116abba09
7
- data.tar.gz: 99d6701412b6ccda6cae2c34812d0c67a739b7f70f113163380f2af766f57f1861dfa6facf6776107d010f0f303ffa016dddc2c2673689c4a4c5a9184c45ccef
6
+ metadata.gz: 835a3ae2e4f2c4f7b5d74af16ea4e560ae6a95fd7929bedff3cccdbff15442b8cdd22d55259985ca7d6f089a17ff70f022023e4613142e9dd6c569c7bf32a973
7
+ data.tar.gz: 4ec7206954f12b3fe7e78fbf7996776701af1dc7be0dbc79dc1e1be67c7ed379b339871190dac881dd2baf81a24d58874d41083e2806618be43a851d6c4819fc
@@ -2,8 +2,9 @@ module Morpho
2
2
  module Entities
3
3
  module SignIn
4
4
  class AuthenticationToken < ::Morpho::Entities::Base
5
- expose :token, documentation: { type: 'string', desc: 'User authentication token', required: true }
5
+ expose :authentication_token, documentation: { type: 'string', desc: 'User authentication token', required: true }
6
6
  expose :expires_at, documentation: { type: 'string', desc: 'Authentication token expiration date in millis', required: true }
7
+ expose :refresh_token, documentation: { type: 'string', desc: 'User refresh token', required: true }
7
8
  end
8
9
  end
9
10
  end
@@ -0,0 +1,10 @@
1
+ module Morpho
2
+ module Entities
3
+ module SignIn
4
+ class Credentials < ::Morpho::Entities::Base
5
+ expose :email, documentation: { type: 'string', desc: 'User email address' }
6
+ expose :password, documentation: { type: 'string', desc: 'User password' }
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module Morpho
2
+ module Entities
3
+ module SignIn
4
+ class RefreshToken < ::Morpho::Entities::Base
5
+ expose :refresh_token, documentation: { type: 'string', desc: 'User refresh token', required: true }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,8 +1,6 @@
1
1
  module Morpho
2
- module Grape
2
+ module Helpers
3
3
  module HTTPResponses
4
- extend ActiveSupport::Concern
5
-
6
4
  protected
7
5
 
8
6
  def render_bad_request
@@ -1,8 +1,6 @@
1
1
  module Morpho
2
- module Grape
2
+ module Helpers
3
3
  module UserActivation
4
- extend ActiveSupport::Concern
5
-
6
4
  protected
7
5
 
8
6
  def current_user
@@ -1,8 +1,6 @@
1
1
  module Morpho
2
- module Grape
3
- module JWTAuthentication
4
- extend ActiveSupport::Concern
5
-
2
+ module Helpers
3
+ module UserLogin
6
4
  protected
7
5
 
8
6
  def logged_in?
@@ -14,12 +12,13 @@ module Morpho
14
12
  end
15
13
 
16
14
  def login(user_params)
17
- user = User.find_by(email: user_params[:email])
15
+ user = Morpho::User.find_by(email: user_params[:email])
18
16
 
19
17
  if user
20
18
  if user.active?
21
19
  if !user.login_locked?
22
20
  if user.valid_password?(user_params[:password])
21
+ user.generate_refresh_token!
23
22
  token = user_payload(user)
24
23
 
25
24
  present token, with: Morpho::Entities::SignIn::AuthenticationToken
@@ -70,7 +69,7 @@ module Morpho
70
69
  expires_at = Time.now.to_i + Morpho.config.jwt.expiration_time
71
70
  issued_at = Time.now.to_i
72
71
 
73
- { token: jwt_encode({ exp: expires_at, iat: issued_at, email: user.email }), expires_at: expires_at }
72
+ { authentication_token: jwt_encode({ exp: expires_at, iat: issued_at, email: user.email }), expires_at: expires_at, refresh_token: user.refresh_token }
74
73
  end
75
74
  end
76
75
  end
@@ -1,8 +1,6 @@
1
1
  module Morpho
2
- module Grape
2
+ module Helpers
3
3
  module UserPasswordReset
4
- extend ActiveSupport::Concern
5
-
6
4
  protected
7
5
 
8
6
  def current_user
@@ -0,0 +1,24 @@
1
+ module Morpho
2
+ module Helpers
3
+ module UserRefreshAuthenticationToken
4
+ protected
5
+
6
+ def valid_refresh_token?(refresh_token_params)
7
+ Morpho::User.exists?(refresh_token: refresh_token_params[:refresh_token])
8
+ end
9
+
10
+ def refresh_token(refresh_token_params)
11
+ if self.valid_refresh_token?(refresh_token_params)
12
+ user = Morpho::User.find_by(refresh_token: refresh_token_params[:refresh_token])
13
+
14
+ user.generate_refresh_token!
15
+ token = user_payload(user)
16
+
17
+ present token, with: Morpho::Entities::SignIn::AuthenticationToken
18
+ else
19
+ render_unprocessable_entity_detailed([I18n.t('morpho.api.messages.refresh_token.invalid')])
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,8 +1,6 @@
1
1
  module Morpho
2
- module Grape
2
+ module Helpers
3
3
  module UserRegistration
4
- extend ActiveSupport::Concern
5
-
6
4
  protected
7
5
 
8
6
  def register(user_params)
@@ -1,8 +1,6 @@
1
1
  module Morpho
2
- module Grape
2
+ module Helpers
3
3
  module UserUnlock
4
- extend ActiveSupport::Concern
5
-
6
4
  protected
7
5
 
8
6
  def current_user
@@ -1,7 +1,8 @@
1
1
  module Morpho
2
2
  module Resources
3
3
  class Activations < ::Grape::API
4
- helpers Morpho::Grape::HTTPResponses, Morpho::Grape::UserActivation
4
+ helpers Morpho::Helpers::HTTPResponses,
5
+ Morpho::Helpers::UserActivation
5
6
 
6
7
  namespace :activations do
7
8
  desc 'Request user activation token' do
@@ -1,7 +1,8 @@
1
1
  module Morpho
2
2
  module Resources
3
3
  class Passwords < ::Grape::API
4
- helpers Morpho::Grape::HTTPResponses, Morpho::Grape::UserPasswordReset
4
+ helpers Morpho::Helpers::HTTPResponses,
5
+ Morpho::Helpers::UserPasswordReset
5
6
 
6
7
  namespace :passwords do
7
8
  desc 'Request user reset password token' do
@@ -1,7 +1,9 @@
1
1
  module Morpho
2
2
  module Resources
3
3
  class Tokens < ::Grape::API
4
- helpers Morpho::Grape::HTTPResponses, Morpho::Grape::JWTAuthentication
4
+ helpers Morpho::Helpers::HTTPResponses,
5
+ Morpho::Helpers::UserLogin,
6
+ Morpho::Helpers::UserRefreshAuthenticationToken
5
7
 
6
8
  namespace :tokens do
7
9
  desc 'Request user authentication token' do
@@ -11,11 +13,24 @@ module Morpho
11
13
  ]
12
14
  end
13
15
  params do
14
- requires :data, type: Morpho::Entities::UserSignIn
16
+ requires :data, type: Morpho::Entities::SignIn::Credentials
15
17
  end
16
18
  post do
17
19
  login(params[:data])
18
20
  end
21
+
22
+ desc 'Refresh user authentication token' do
23
+ success Morpho::Entities::SignIn::Success
24
+ failure [
25
+ [ 422, I18n.t('morpho.api.messages.unprocessable_entity'), Morpho::Entities::Error ]
26
+ ]
27
+ end
28
+ params do
29
+ requires :data, type: Morpho::Entities::SignIn::RefreshToken
30
+ end
31
+ post :refresh do
32
+ refresh_token(params[:data])
33
+ end
19
34
  end
20
35
  end
21
36
  end
@@ -1,7 +1,8 @@
1
1
  module Morpho
2
2
  module Resources
3
3
  class Unlocks < ::Grape::API
4
- helpers Morpho::Grape::HTTPResponses, Morpho::Grape::UserUnlock
4
+ helpers Morpho::Helpers::HTTPResponses,
5
+ Morpho::Helpers::UserUnlock
5
6
 
6
7
  namespace :unlocks do
7
8
  desc 'Request user unlock token' do
@@ -1,7 +1,8 @@
1
1
  module Morpho
2
2
  module Resources
3
3
  class Users < ::Grape::API
4
- helpers Morpho::Grape::HTTPResponses, Morpho::Grape::UserRegistration
4
+ helpers Morpho::Helpers::HTTPResponses,
5
+ Morpho::Helpers::UserRegistration
5
6
 
6
7
  namespace :users do
7
8
  desc 'User registration' do
@@ -0,0 +1,23 @@
1
+ module Morpho
2
+ module Tokenable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ before_create :generate_refresh_token
7
+ end
8
+
9
+ def generate_refresh_token!
10
+ self.generate_refresh_token
11
+ self.save
12
+ end
13
+
14
+ protected
15
+
16
+ def generate_refresh_token
17
+ self.refresh_token = loop do
18
+ random_token = SecureRandom.urlsafe_base64(nil, false)
19
+ break random_token unless self.class.exists?(refresh_token: random_token)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -5,11 +5,6 @@ module Morpho
5
5
  has_many :authentications, dependent: :destroy
6
6
  accepts_nested_attributes_for :authentications
7
7
 
8
- validates :password, length: { minimum: Morpho.config.auth.password_minimum_length },
9
- :'morpho/validators/contain_number' => true,
10
- :'morpho/validators/contain_uppercase' => true,
11
- :'morpho/validators/contain_symbol' => true
12
- validates :password, confirmation: true
13
8
  validates :email, uniqueness: true
14
9
  validates_email_format_of :email
15
10
 
@@ -142,6 +142,8 @@ en:
142
142
  bad_credentials: 'User email and/or password is incorrect'
143
143
  unconfirmed: 'User account has not been confirmed'
144
144
  locked: 'User account has been locked'
145
+ refresh_token:
146
+ invalid: 'Invalid token'
145
147
  simple_form:
146
148
  'yes': 'Yes'
147
149
  'no': 'No'
@@ -142,6 +142,8 @@ es:
142
142
  bad_credentials: 'Correo electrónico y/o contraseña es incorrecto(a)'
143
143
  unconfirmed: 'Cuenta de usuario no ha sido confirmada'
144
144
  locked: 'Cuenta de usuario ha sido bloqueada'
145
+ refresh_token:
146
+ invalid: 'El token es inválido'
145
147
  simple_form:
146
148
  'yes': 'Si'
147
149
  'no': 'No'
@@ -0,0 +1,5 @@
1
+ class AddRefreshTokenToUsersTable < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :morpho_users, :refresh_token, :string, index: true
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module Morpho
2
- VERSION = '0.3.1'
2
+ VERSION = '0.3.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morpho
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hugo Gilmar Erazo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-18 00:00:00.000000000 Z
11
+ date: 2018-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -244,19 +244,21 @@ files:
244
244
  - MIT-LICENSE
245
245
  - README.md
246
246
  - Rakefile
247
- - app/api/concerns/morpho/grape/http_responses.rb
248
- - app/api/concerns/morpho/grape/jwt_authentication.rb
249
- - app/api/concerns/morpho/grape/user_activation.rb
250
- - app/api/concerns/morpho/grape/user_password_reset.rb
251
- - app/api/concerns/morpho/grape/user_registration.rb
252
- - app/api/concerns/morpho/grape/user_unlock.rb
253
247
  - app/api/morpho/entities/base.rb
254
248
  - app/api/morpho/entities/error.rb
255
249
  - app/api/morpho/entities/sign_in/authentication_token.rb
250
+ - app/api/morpho/entities/sign_in/credentials.rb
251
+ - app/api/morpho/entities/sign_in/refresh_token.rb
256
252
  - app/api/morpho/entities/sign_in/success.rb
257
253
  - app/api/morpho/entities/user.rb
258
- - app/api/morpho/entities/user_sign_in.rb
259
254
  - app/api/morpho/entities/user_sign_up.rb
255
+ - app/api/morpho/helpers/http_responses.rb
256
+ - app/api/morpho/helpers/user_activation.rb
257
+ - app/api/morpho/helpers/user_login.rb
258
+ - app/api/morpho/helpers/user_password_reset.rb
259
+ - app/api/morpho/helpers/user_refresh_authentication_token.rb
260
+ - app/api/morpho/helpers/user_registration.rb
261
+ - app/api/morpho/helpers/user_unlock.rb
260
262
  - app/api/morpho/resources/activations.rb
261
263
  - app/api/morpho/resources/passwords.rb
262
264
  - app/api/morpho/resources/tokens.rb
@@ -278,6 +280,7 @@ files:
278
280
  - app/jobs/morpho/application_job.rb
279
281
  - app/mailers/morpho/application_mailer.rb
280
282
  - app/mailers/morpho/user_mailer.rb
283
+ - app/models/concerns/morpho/tokenable.rb
281
284
  - app/models/morpho/application_record.rb
282
285
  - app/models/morpho/authentication.rb
283
286
  - app/models/morpho/user.rb
@@ -314,6 +317,7 @@ files:
314
317
  - db/migrate/20180919162058_sorcery_brute_force_protection.rb
315
318
  - db/migrate/20180919162059_sorcery_activity_logging.rb
316
319
  - db/migrate/20180919162100_sorcery_external.rb
320
+ - db/migrate/20181019162225_add_refresh_token_to_users_table.rb
317
321
  - lib/generators/morpho/install/install_generator.rb
318
322
  - lib/generators/morpho/install/templates/app/api/morpho/api.rb
319
323
  - lib/generators/morpho/install/templates/config/initializers/morpho.rb
@@ -1,8 +0,0 @@
1
- module Morpho
2
- module Entities
3
- class UserSignIn < ::Morpho::Entities::Base
4
- expose :email, documentation: { type: 'string', desc: 'User email address' }
5
- expose :password, documentation: { type: 'string', desc: 'User password' }
6
- end
7
- end
8
- end