morpho 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
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