grape-knock 0.1.1 → 0.2.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: 4807209f1dd16ed6c0c7745e215459ce530937e1
4
- data.tar.gz: cb81980c4e78683d4c08a1ec0a49a6b321d25197
3
+ metadata.gz: 50cd128cfd75e40bcb80421915a41787e9244805
4
+ data.tar.gz: 123a4f325d95f1a16917779ad3ab6f6f3c4e4c32
5
5
  SHA512:
6
- metadata.gz: fc945a605704f04fadca44f6ebe299a523baeb6c741d279c16cf6ceb730e80f5a4c10e88998294dba9c1a2e218301c303d8b1e1a85dfb4a213b0ac622fe1f77b
7
- data.tar.gz: 97f6d59291a2033bb44addb752e53571485a6f5b3cfdc0802c2f1ee7584bac576c31f3a7204d1c373333bf6b360f81963aab312ab75200529b0c4e52ce80a049
6
+ metadata.gz: 5642c5d80ff6f03ebd770edb7d1b16893a00338c14ab16996996a67a5397a9c674606a421b3a229397067b08ec35c46f72d94b9a37fe72e4dbb11d6e779f94ec
7
+ data.tar.gz: 6ead0a60917a7564a11e90fdb09a52f1c5ccad90c1c690e2f8d1e145ef6831c6fd2a015e1e5dd1b8ed11bafa62a602a0e1f02fa8811a93b56cdc593a6a02f282
@@ -0,0 +1,9 @@
1
+ exit
2
+ getter_name
3
+ self.class_name
4
+ self.class
5
+ self
6
+ continue
7
+ getter_name
8
+ continue
9
+ env
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ .idea
data/README.md CHANGED
@@ -30,6 +30,24 @@ class MyApi < Grape::API
30
30
  end
31
31
  ```
32
32
 
33
+ You now have a `current_user` method available in your endpoints:
34
+
35
+ ```ruby
36
+ class MyApi < Grape::API
37
+ format :json
38
+
39
+ use Grape::Knock::Authenticable
40
+
41
+ resource :comments do
42
+ get do
43
+ current_user.comments
44
+ end
45
+ end
46
+ end
47
+ ```
48
+
49
+
50
+
33
51
  The gem will raise `Grape::Knock::ForbiddenError` when authentication failed. You can rescue this exception in your API
34
52
  in order to respond with a `403 Forbidden` http request:
35
53
 
@@ -67,4 +85,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN
67
85
  ## License
68
86
 
69
87
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
70
-
@@ -21,8 +21,9 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_dependency "grape", ">= 0.10"
23
23
  spec.add_dependency "knock"
24
-
24
+
25
25
  spec.add_development_dependency "bundler", "~> 1.10"
26
+ spec.add_development_dependency "byebug"
26
27
  spec.add_development_dependency "rake", "~> 10.0"
27
28
  spec.add_development_dependency "rspec"
28
29
  end
@@ -1,6 +1,7 @@
1
1
  require 'grape'
2
2
  require 'grape/knock/version'
3
3
  require 'grape/knock/authenticable'
4
+ require 'jwt'
4
5
 
5
6
  module Grape
6
7
  module Knock
@@ -1,37 +1,71 @@
1
1
  require 'knock'
2
2
  require 'knock/authenticable'
3
3
  require 'grape/knock/forbidden_error'
4
- require 'grape/knock/methods'
5
4
 
6
5
  module Grape
7
6
  module Knock
8
7
  class Authenticable < Grape::Middleware::Base
9
8
  include ::Knock::Authenticable
10
9
 
10
+ def initialize(_, options = {})
11
+ super
12
+ define_current_entity_getter entity_class, getter_name
13
+ end
14
+
11
15
  def context
12
16
  env['api.endpoint']
13
17
  end
14
18
 
15
19
  def before
16
20
  authenticate
17
- context.extend Grape::Knock::Methods
18
- context.current_user = @current_user
21
+
22
+ memoization_var_name = "@_#{getter_name}"
23
+ context.send(:instance_variable_set, memoization_var_name, send(getter_name))
24
+ context.class.send(:define_method, getter_name) { instance_variable_get memoization_var_name }
19
25
  end
20
26
 
21
27
  private
22
28
 
23
29
  def authenticate
24
30
  fail ::Grape::Knock::ForbiddenError unless token
25
- @current_user = ::Knock::AuthToken.new(token: token).current_user
26
- fail ::Grape::Knock::ForbiddenError unless @current_user
31
+ fail ::Grape::Knock::ForbiddenError unless send(getter_name)
27
32
  rescue ::JWT::DecodeError
28
33
  fail ::Grape::Knock::ForbiddenError
29
34
  end
30
35
 
31
- def token
32
- env['HTTP_AUTHORIZATION'].to_s.split(' ').last
36
+ def define_current_entity_getter(entity_class, getter_name)
37
+ unless self.respond_to?(getter_name)
38
+ memoization_var_name = "@_#{getter_name}"
39
+ self.class.send(:define_method, getter_name) do
40
+ unless instance_variable_defined?(memoization_var_name)
41
+ current =
42
+ begin
43
+ ::Knock::AuthToken.new(token: token).entity_for(entity_class)
44
+ rescue ::Knock.not_found_exception_class, JWT::DecodeError
45
+ nil
46
+ end
47
+ instance_variable_set(memoization_var_name, current)
48
+ end
49
+ instance_variable_get(memoization_var_name)
50
+ end
51
+ end
33
52
  end
34
53
 
54
+ def entity_class
55
+ @options[:entity_class] || Object.const_get('User')
56
+ end
57
+
58
+ def getter_name
59
+ "current_#{entity_class.to_s.parameterize.underscore}".freeze
60
+ end
61
+
62
+ def header_name
63
+ (@options[:header_name] || 'HTTP_AUTHORIZATION').freeze
64
+ end
65
+
66
+ def token
67
+ env[header_name].to_s.split(' ').last
68
+ end
35
69
  end
36
70
  end
37
71
  end
@@ -1,5 +1,5 @@
1
1
  module Grape
2
2
  module Knock
3
- VERSION = '0.1.1'
3
+ VERSION = '0.2.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,83 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-knock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre-Louis Gottfrois
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-08-20 00:00:00.000000000 Z
11
+ date: 2017-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0.10'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.10'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: knock
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.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
54
  version: '1.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - ~>
73
+ - - "~>"
60
74
  - !ruby/object:Gem::Version
61
75
  version: '10.0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - ~>
80
+ - - "~>"
67
81
  - !ruby/object:Gem::Version
68
82
  version: '10.0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rspec
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - '>='
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
89
  version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - '>='
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  description: Use Knock with Grape.
@@ -87,9 +101,10 @@ executables: []
87
101
  extensions: []
88
102
  extra_rdoc_files: []
89
103
  files:
90
- - .gitignore
91
- - .rspec
92
- - .travis.yml
104
+ - ".byebug_history"
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - ".travis.yml"
93
108
  - Gemfile
94
109
  - LICENSE.txt
95
110
  - README.md
@@ -100,7 +115,6 @@ files:
100
115
  - lib/grape/knock.rb
101
116
  - lib/grape/knock/authenticable.rb
102
117
  - lib/grape/knock/forbidden_error.rb
103
- - lib/grape/knock/methods.rb
104
118
  - lib/grape/knock/version.rb
105
119
  homepage: https://github.com/gottfrois/grape-knock
106
120
  licenses:
@@ -112,17 +126,17 @@ require_paths:
112
126
  - lib
113
127
  required_ruby_version: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - '>='
129
+ - - ">="
116
130
  - !ruby/object:Gem::Version
117
131
  version: '0'
118
132
  required_rubygems_version: !ruby/object:Gem::Requirement
119
133
  requirements:
120
- - - '>='
134
+ - - ">="
121
135
  - !ruby/object:Gem::Version
122
136
  version: '0'
123
137
  requirements: []
124
138
  rubyforge_project:
125
- rubygems_version: 2.4.6
139
+ rubygems_version: 2.6.13
126
140
  signing_key:
127
141
  specification_version: 4
128
142
  summary: Use Knock with Grape.
@@ -1,9 +0,0 @@
1
- module Grape
2
- module Knock
3
- module Methods
4
-
5
- attr_accessor :current_user
6
-
7
- end
8
- end
9
- end