graphql-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
  SHA256:
3
- metadata.gz: 2d9b9e3eebb716abb0ae389627c8006f6e83c59a524d0a47952f4ca7b5ae71b0
4
- data.tar.gz: ea1d59f34080c3f8de6c93ca863896749e2eee33c639ddd03a04769634dd5978
3
+ metadata.gz: 239047f413613df84be135670d06f73647858b26e809c4e01758480e76b70d78
4
+ data.tar.gz: 9a2e28b7ef4376a9599d75b4fbbba0e7a393b949d65d5ddf20dff79d94e56850
5
5
  SHA512:
6
- metadata.gz: e63952bea921336b3e583af3f27eba1dde05b1fd21004be8d6eefd97086d51b0535b6290f065ff6a9683ec17d3e20661a584d123756d079552c07a7eeeb3e365
7
- data.tar.gz: e10144fa6c1d8ded3de6f4f0e4f4d449c4a4561485c9a03910e776d1c3d9b4f346ed224c7dae4d5efdbd2c7579924018f54ae7da14351f042d45777b013fecb9
6
+ metadata.gz: 1a1d89eb38a6568dde0443258f7c056045c78d5dd02dc583f6c8b5a48f4122beef8bf7f9af7d98318d77184860169a9b68869761e9832aca2fe796b66b60cc85
7
+ data.tar.gz: 5576358760b8c8b820476055d673b8a793dd6f16d71031d5286f3b3e02aeda417e79f9ffe942c7af49e58556a51ae967072f4977042fde31cf33eaac63167ca3
@@ -10,7 +10,8 @@ class Mutations::Auth::ForgotPassword < GraphQL::Schema::Mutation
10
10
  field :valid, Boolean, null: false
11
11
 
12
12
  def resolve(email:)
13
- user = User.find_by email: email
13
+ user = User.where(locked_at: nil).find_by email: email
14
+
14
15
  user.send_reset_password_instructions if user.present?
15
16
 
16
17
  {
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Mutations::Auth::LockAccount < GraphQL::Schema::Mutation
4
+ argument :id, ID, required: true do
5
+ description 'User id'
6
+ end
7
+
8
+ field :errors, [::Types::Auth::Error], null: false
9
+ field :success, Boolean, null: false
10
+ field :user, GraphQL::Auth.configuration.user_type.constantize, null: true
11
+
12
+ def resolve(id:)
13
+ user = User.where(locked_at: nil).find_by id: id
14
+
15
+ if context[:current_user] && user.present? && user.lock_access!
16
+ {
17
+ errors: [],
18
+ success: true,
19
+ user: user
20
+ }
21
+ else
22
+ {
23
+ errors: [
24
+ { field: :_error, message: I18n.t('devise.locks.cannot_lock') }
25
+ ],
26
+ success: false,
27
+ user: user
28
+ }
29
+ end
30
+ end
31
+ end
@@ -17,7 +17,7 @@ class Mutations::Auth::ResetPassword < GraphQL::Schema::Mutation
17
17
  field :success, Boolean, null: false
18
18
 
19
19
  def resolve(args)
20
- user = User.reset_password_by_token args
20
+ user = User.where(locked_at: nil).reset_password_by_token args
21
21
 
22
22
  if user.errors.any?
23
23
  {
@@ -11,18 +11,19 @@ class Mutations::Auth::SignIn < GraphQL::Schema::Mutation
11
11
  description "The user's password"
12
12
  end
13
13
 
14
- argument :remember_me, Boolean, required: true do
14
+ argument :remember_me, Boolean, required: false do
15
15
  description "User's checkbox to be remembered after connection timeout"
16
16
  end
17
17
 
18
18
  field :errors, [::Types::Auth::Error], null: false
19
19
  field :success, Boolean, null: false
20
- field :user, ::Types::Auth::User, null: true
20
+ field :user, GraphQL::Auth.configuration.user_type.constantize, null: true
21
21
 
22
22
  def resolve(email:, password:, remember_me:)
23
23
  response = context[:response]
24
24
 
25
- user = User.find_by email: email
25
+ user = User.where(locked_at: nil).find_by email: email
26
+
26
27
  valid_sign_in = user.present? && user.valid_password?(password)
27
28
 
28
29
  if valid_sign_in
@@ -44,7 +45,7 @@ class Mutations::Auth::SignIn < GraphQL::Schema::Mutation
44
45
  }
45
46
  ],
46
47
  success: false,
47
- user: nil,
48
+ user: nil
48
49
  }
49
50
  end
50
51
  end
@@ -17,7 +17,7 @@ class Mutations::Auth::SignUp < GraphQL::Schema::Mutation
17
17
 
18
18
  field :errors, [::Types::Auth::Error], null: false
19
19
  field :success, Boolean, null: false
20
- field :user, ::Types::Auth::User, null: true
20
+ field :user, GraphQL::Auth.configuration.user_type.constantize, null: true
21
21
 
22
22
  def resolve(args)
23
23
  response = context[:response]
@@ -37,7 +37,7 @@ class Mutations::Auth::SignUp < GraphQL::Schema::Mutation
37
37
  { field: field.to_s.camelize(:lower), message: messages.first.capitalize }
38
38
  end,
39
39
  success: false,
40
- user: nil,
40
+ user: nil
41
41
  }
42
42
  end
43
43
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Mutations::Auth::UnlockAccount < GraphQL::Schema::Mutation
4
+ argument :id, ID, required: true do
5
+ description 'User id'
6
+ end
7
+
8
+ field :errors, [::Types::Auth::Error], null: false
9
+ field :success, Boolean, null: false
10
+ field :user, GraphQL::Auth.configuration.user_type.constantize, null: true
11
+
12
+ def resolve(id:)
13
+ user = User.where.not(locked_at: nil).find_by id: id
14
+
15
+ if context[:current_user] && user.present? && user.unlock_access!
16
+ {
17
+ errors: [],
18
+ success: true,
19
+ user: user
20
+ }
21
+ else
22
+ {
23
+ errors: [
24
+ { field: :_error, message: I18n.t('devise.unlocks.cannot_unlock') }
25
+ ],
26
+ success: false,
27
+ user: user
28
+ }
29
+ end
30
+ end
31
+ end
@@ -15,7 +15,7 @@ class Mutations::Auth::UpdateAccount < GraphQL::Schema::Mutation
15
15
 
16
16
  field :errors, [::Types::Auth::Error], null: false
17
17
  field :success, Boolean, null: false
18
- field :user, ::Types::Auth::User, null: true
18
+ field :user, GraphQL::Auth.configuration.user_type.constantize, null: true
19
19
 
20
20
  def resolve(args)
21
21
  user = context[:current_user]
@@ -3,17 +3,26 @@
3
3
  class Mutations::Auth::ValidateToken < GraphQL::Schema::Mutation
4
4
  field :errors, [::Types::Auth::Error], null: false
5
5
  field :success, Boolean, null: false
6
- field :user, ::Types::Auth::User, null: true
6
+ field :user, GraphQL::Auth.configuration.user_type.constantize, null: true
7
7
  field :valid, Boolean, null: false
8
8
 
9
9
  def resolve
10
10
  user = context[:current_user]
11
11
 
12
- {
13
- errors: [],
14
- success: user.present?,
15
- user: user,
16
- valid: user.present?,
17
- }
12
+ if user.present? && !user.access_locked?
13
+ {
14
+ errors: [],
15
+ success: true,
16
+ user: user,
17
+ valid: true
18
+ }
19
+ else
20
+ {
21
+ errors: [],
22
+ success: false,
23
+ user: nil,
24
+ valid: false
25
+ }
26
+ end
18
27
  end
19
28
  end
@@ -3,13 +3,24 @@
3
3
  module Types::GraphqlAuth
4
4
  include GraphQL::Schema::Interface
5
5
 
6
- field :sign_in, mutation: GraphQL::Auth.configuration.sign_in_mutation
7
- field :sign_up, mutation: GraphQL::Auth.configuration.sign_up_mutation
8
-
9
- field :forgot_password, mutation: GraphQL::Auth.configuration.forgot_password_mutation
10
- field :reset_password, mutation: GraphQL::Auth.configuration.reset_password_mutation
11
-
12
- field :update_account, mutation: GraphQL::Auth.configuration.update_account_mutation
13
-
14
- field :validate_token, mutation: GraphQL::Auth.configuration.validate_token_mutation
15
- end
6
+ field :sign_in, mutation: ::Mutations::Auth::SignIn
7
+
8
+ if GraphQL::Auth.configuration.lock_account_mutation
9
+ field :sign_up, mutation: ::Mutations::Auth::SignUp
10
+ end
11
+
12
+ field :forgot_password, mutation: ::Mutations::Auth::ForgotPassword
13
+ field :reset_password, mutation: ::Mutations::Auth::ResetPassword
14
+
15
+ field :update_account, mutation: ::Mutations::Auth::UpdateAccount
16
+
17
+ field :validate_token, mutation: ::Mutations::Auth::ValidateToken
18
+
19
+ if GraphQL::Auth.configuration.lock_account_mutation
20
+ field :lock_account, mutation: Mutations::Auth::LockAccount
21
+ end
22
+
23
+ if GraphQL::Auth.configuration.unlock_account_mutation
24
+ field :unlock_account, mutation: Mutations::Auth::UnlockAccount
25
+ end
26
+ end
@@ -9,40 +9,36 @@ module Graphql
9
9
  def context
10
10
  {
11
11
  current_user: current_user,
12
- response: response,
12
+ response: response
13
13
  }
14
14
  end
15
15
 
16
16
  # set current user from Authorization header
17
17
  def current_user
18
- return if request.headers['Authorization'].nil?
18
+ authorization_token = request.headers['Authorization']
19
+ return nil if authorization_token.nil?
19
20
 
20
- decrypted_token = GraphQL::Auth::JwtManager.decode(request.headers['Authorization'])
21
-
22
- user_id = decrypted_token['user']
23
- user = User.find_by id: user_id
21
+ decrypted_token = GraphQL::Auth::JwtManager.decode(authorization_token)
22
+ user = User.find_by id: decrypted_token['user']
23
+ return nil if user.blank? || user.access_locked?
24
24
 
25
25
  # update token if user is found with token
26
- if user.present?
27
- generate_access_token(user, response)
28
- end
26
+ generate_access_token(user, response)
29
27
 
30
28
  user
31
29
 
32
30
  # rescue expired Authorization header with RefreshToken header
33
31
  rescue JWT::ExpiredSignature
34
- return nil if request.headers['RefreshToken'].nil?
32
+ refresh_token = request.headers['RefreshToken']
33
+ return nil if refresh_token.nil?
35
34
 
36
- user = User.find_by refresh_token: request.headers['RefreshToken']
35
+ user = User.find_by refresh_token: refresh_token
36
+ return nil if user.blank? || user.access_locked?
37
37
 
38
- if user.present?
39
- generate_access_token(user, response)
40
- set_refresh_token(user, response)
41
- end
38
+ generate_access_token(user, response)
39
+ set_refresh_token(user, response)
42
40
 
43
41
  user
44
42
  end
45
-
46
-
47
43
  end
48
44
  end
@@ -0,0 +1,5 @@
1
+ class AddLockableToDevise < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :users, :locked_at, :datetime
4
+ end
5
+ end
@@ -3,15 +3,9 @@ GraphQL::Auth.configure do |config|
3
3
  # config.jwt_secret_key = ENV['JWT_SECRET_KEY']
4
4
  # config.app_url = ENV['APP_URL']
5
5
 
6
- # config.user_type = ::Type::Auth::User
6
+ # config.user_type = '::Types::Auth::User'
7
7
 
8
- # config.sign_in_mutation = ::Mutations::Auth::SignIn
9
- # config.sign_up_mutation = ::Mutations::Auth::SignUp
10
-
11
- # config.forgot_password_mutation = ::Mutations::Auth::ForgotPassword
12
- # config.reset_password_mutation = ::Mutations::Auth::ResetPassword
13
-
14
- # config.update_account_mutation = ::Mutations::Auth::UpdateAccount
15
-
16
- # config.validate_token_mutation = ::Mutations::Auth::ValidateToken
8
+ # config.sign_up_mutation = false
9
+ # config.lock_account_mutation = false
10
+ # config.unlock_account_mutation = false
17
11
  end
@@ -5,29 +5,20 @@ module GraphQL
5
5
  :jwt_secret_key,
6
6
  :app_url,
7
7
  :user_type,
8
- :sign_in_mutation,
9
8
  :sign_up_mutation,
10
- :forgot_password_mutation,
11
- :reset_password_mutation,
12
- :update_account_mutation,
13
- :validate_token_mutation
9
+ :lock_account_mutation,
10
+ :unlock_account_mutation
14
11
 
15
12
  def initialize
16
13
  @token_lifespan = 4.hours
17
14
  @jwt_secret_key = ENV['JWT_SECRET_KEY']
18
15
  @app_url = ENV['APP_URL']
19
16
 
20
- @user_type = ::Types::Auth::User
17
+ @user_type = '::Types::Auth::User'
21
18
 
22
- @sign_in_mutation = ::Mutations::Auth::SignIn
23
- @sign_up_mutation = ::Mutations::Auth::SignUp
24
-
25
- @forgot_password_mutation = ::Mutations::Auth::ForgotPassword
26
- @reset_password_mutation = ::Mutations::Auth::ResetPassword
27
-
28
- @update_account_mutation = ::Mutations::Auth::UpdateAccount
29
-
30
- @validate_token_mutation = ::Mutations::Auth::ValidateToken
19
+ @sign_up_mutation = false
20
+ @lock_account_mutation = false
21
+ @unlock_account_mutation = false
31
22
  end
32
23
  end
33
24
  end
@@ -1,5 +1,5 @@
1
1
  module GraphQL
2
2
  module Auth
3
- VERSION = '0.3.0'
3
+ VERSION = '0.4.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-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
  - Guillaume Ferland
8
+ - Brice Sanchez
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2019-02-21 00:00:00.000000000 Z
12
+ date: 2019-03-05 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rails
@@ -146,9 +147,11 @@ files:
146
147
  - README.md
147
148
  - Rakefile
148
149
  - app/graphql/mutations/auth/forgot_password.rb
150
+ - app/graphql/mutations/auth/lock_account.rb
149
151
  - app/graphql/mutations/auth/reset_password.rb
150
152
  - app/graphql/mutations/auth/sign_in.rb
151
153
  - app/graphql/mutations/auth/sign_up.rb
154
+ - app/graphql/mutations/auth/unlock_account.rb
152
155
  - app/graphql/mutations/auth/update_account.rb
153
156
  - app/graphql/mutations/auth/validate_token.rb
154
157
  - app/graphql/types/auth/error.rb
@@ -158,6 +161,7 @@ files:
158
161
  - app/helpers/graphql/token_helper.rb
159
162
  - app/views/devise/mailer/reset_password_instructions.html.erb
160
163
  - db/migrate/20190108151146_add_refresh_token_to_user.rb
164
+ - db/migrate/20190226175233_add_lockable_to_devise.rb
161
165
  - lib/generators/graphql_auth/install_generator.rb
162
166
  - lib/generators/graphql_auth/templates/graphql_auth.rb.erb
163
167
  - lib/graphql-auth.rb