graphql-auth 0.3.0 → 0.4.0

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: 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