grape-knock 0.1.1 → 0.2.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
  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