rack-authentication_bearer 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/rack/authentication_bearer.rb +22 -27
- data/lib/rack/authentication_bearer/invalid_bearer_token_error.rb +15 -0
- data/lib/rack/authentication_bearer/missing_bearer_token_error.rb +15 -0
- data/lib/rack/authentication_bearer/version.rb +1 -1
- data/spec/lib/rack/authentication_bearer_spec.rb +35 -16
- data/spec/spec_helper.rb +1 -3
- metadata +10 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3bfef1eb0eaf10a966794d416a5536c96b406f717d45a57466ff608cf5b56f38
|
4
|
+
data.tar.gz: db6d7f17f8ade3e6e1086ed460b4f5518b4211d22745cfb844074a9886f6ad6c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82003422eb4add5675de7441b1fef5079bf643851cdfa5dc6d698957c838f73c96c1c5cf1a30aad77b33eeef502e6188583f9dfbb4eb4e7ccd17e060600cb7f4
|
7
|
+
data.tar.gz: 61d3040df5765dd1815e1cd0d4ce2b6a0880399e3feedadd3395fb4a28dff6b0a98562370a6c51a363c39772d36ba4accf0ab161646cb8004b72933a8b02d971
|
@@ -1,13 +1,19 @@
|
|
1
1
|
module Rack
|
2
2
|
class AuthenticationBearer
|
3
3
|
require_relative "authentication_bearer/version"
|
4
|
-
|
4
|
+
require_relative "authentication_bearer/invalid_bearer_token_error"
|
5
|
+
require_relative "authentication_bearer/missing_bearer_token_error"
|
6
|
+
PATTERN = /^Bearer ([\w\d\.~\+\/]+=*)/
|
5
7
|
RACK_KEY = "rack.authentication"
|
6
8
|
AUTHENTICATION_KEY = "HTTP_AUTHENTICATION"
|
7
9
|
AUTHORIZATION_KEY = "HTTP_AUTHORIZATION"
|
8
10
|
|
9
11
|
attr_reader :process
|
10
12
|
private :process
|
13
|
+
attr_reader :state
|
14
|
+
private :state
|
15
|
+
attr_reader :stack
|
16
|
+
private :stack
|
11
17
|
|
12
18
|
def initialize(stack, &process)
|
13
19
|
@stack = stack
|
@@ -17,43 +23,32 @@ module Rack
|
|
17
23
|
def call(previous_state)
|
18
24
|
@state = previous_state
|
19
25
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
state
|
26
|
+
return stack.call(state) unless state
|
27
|
+
return stack.call(state) unless process
|
28
|
+
unless present?
|
29
|
+
return stack.call(state.merge(RACK_KEY => Rack::AuthenticationBearer::MissingBearerTokenError))
|
24
30
|
end
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
private def token
|
30
|
-
if authentication.respond_to?(:split) && authentication.length > 0
|
31
|
-
authentication.split(EXPRESSION).last
|
31
|
+
unless matches?
|
32
|
+
return stack.call(state.merge(RACK_KEY => Rack::AuthenticationBearer::InvalidBearerTokenError))
|
32
33
|
end
|
33
|
-
end
|
34
|
-
|
35
|
-
private def authentication
|
36
|
-
state[AUTHENTICATION_KEY] || state[AUTHORIZATION_KEY]
|
37
|
-
end
|
38
34
|
|
39
|
-
|
40
|
-
@stack
|
35
|
+
stack.call(state.merge(RACK_KEY => process.call(shared)))
|
41
36
|
end
|
42
37
|
|
43
|
-
private def
|
44
|
-
|
38
|
+
private def shared
|
39
|
+
value.match(PATTERN)[1]
|
45
40
|
end
|
46
41
|
|
47
|
-
private def
|
48
|
-
@
|
42
|
+
private def value
|
43
|
+
@value ||= state[AUTHENTICATION_KEY] || state[AUTHORIZATION_KEY]
|
49
44
|
end
|
50
45
|
|
51
|
-
private def
|
52
|
-
|
46
|
+
private def present?
|
47
|
+
value.respond_to?(:length) && value.length > 0
|
53
48
|
end
|
54
49
|
|
55
|
-
private def
|
56
|
-
|
50
|
+
private def matches?
|
51
|
+
value.respond_to?(:match) && value.respond_to?(:length) && value.length > 0 && value.match?(PATTERN)
|
57
52
|
end
|
58
53
|
end
|
59
54
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Rack
|
2
|
+
class AuthenticationBearer
|
3
|
+
class InvalidBearerTokenError < StandardError
|
4
|
+
STATUS = 422
|
5
|
+
|
6
|
+
def initialize(message = nil)
|
7
|
+
@message = message || "The Authentication header value was malformed."
|
8
|
+
end
|
9
|
+
|
10
|
+
def status
|
11
|
+
self.const_get("STATUS")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Rack
|
2
|
+
class AuthenticationBearer
|
3
|
+
class MissingBearerTokenError < StandardError
|
4
|
+
STATUS = 422
|
5
|
+
|
6
|
+
def initialize(message = nil)
|
7
|
+
@message = message || "The Authentication header value was missing."
|
8
|
+
end
|
9
|
+
|
10
|
+
def status
|
11
|
+
self.const_get("STATUS")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,24 +1,43 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Rack::AuthenticationBearer do
|
4
|
-
let(:
|
5
|
-
let(:
|
6
|
-
let(:
|
7
|
-
let(:status) { 200 }
|
8
|
-
let(:headers) do
|
9
|
-
{
|
10
|
-
"REQUEST_METHOD" => verb,
|
11
|
-
"Content-Type" => "text/plain",
|
12
|
-
"Content-Length" => "0"
|
13
|
-
}
|
14
|
-
end
|
15
|
-
let(:body) { "" }
|
16
|
-
|
17
|
-
before(:each) do
|
18
|
-
allow(application).to receive(:call).and_return([status, headers, body])
|
19
|
-
end
|
4
|
+
let(:stack) { ->(a) { a } }
|
5
|
+
let(:process) { ->(b) { Base64.urlsafe_decode64(b) } }
|
6
|
+
let(:middleware) { described_class.new(stack, &process) }
|
20
7
|
|
21
8
|
describe "#call" do
|
9
|
+
let(:call) { middleware.call(previous_state) }
|
10
|
+
|
11
|
+
context "when the Authorization key exists and the value is valid" do
|
12
|
+
let(:previous_state) { {"HTTP_AUTHORIZATION" => "Bearer #{Base64.urlsafe_encode64("This Is A Secret")}"} }
|
13
|
+
|
14
|
+
it "sets the rack.authentication key with the decoded value" do
|
15
|
+
expect(call).to include({"rack.authentication"=> "This Is A Secret"})
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when the Authorization key exists and the value is invalid" do
|
20
|
+
let(:previous_state) { {"HTTP_AUTHORIZATION" => "Bearer "} }
|
21
|
+
|
22
|
+
it "sets the key to an exception" do
|
23
|
+
expect(call).to include("rack.authentication" => Rack::AuthenticationBearer::InvalidBearerTokenError)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "does not call the process" do
|
27
|
+
expect(process).to_not receive(:call)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "when the Authorization key does not exist" do
|
32
|
+
let(:previous_state) { {} }
|
33
|
+
|
34
|
+
it "sets the key to an exception" do
|
35
|
+
expect(call).to include("rack.authentication" => Rack::AuthenticationBearer::MissingBearerTokenError)
|
36
|
+
end
|
22
37
|
|
38
|
+
it "does not call the process" do
|
39
|
+
expect(process).to_not receive(:call)
|
40
|
+
end
|
41
|
+
end
|
23
42
|
end
|
24
43
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-authentication_bearer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Kurtis Rainbolt-Greene
|
7
|
+
- Kurtis Rainbolt-Greene <kurtis@rainbolt-greene.online>
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '12.3'
|
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
|
-
version: '
|
54
|
+
version: '12.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pry
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,34 +80,21 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0.6'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: codeclimate-test-reporter
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0.4'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0.4'
|
97
83
|
description: Middleware for handling Bearer type Authentication
|
98
|
-
email:
|
99
|
-
- me@kurtisrainboltgreene.name
|
84
|
+
email:
|
100
85
|
executables: []
|
101
86
|
extensions: []
|
102
87
|
extra_rdoc_files: []
|
103
88
|
files:
|
104
89
|
- lib/rack-authentication_bearer.rb
|
105
90
|
- lib/rack/authentication_bearer.rb
|
91
|
+
- lib/rack/authentication_bearer/invalid_bearer_token_error.rb
|
92
|
+
- lib/rack/authentication_bearer/missing_bearer_token_error.rb
|
106
93
|
- lib/rack/authentication_bearer/version.rb
|
107
94
|
- spec/lib/rack/authentication_bearer/version_spec.rb
|
108
95
|
- spec/lib/rack/authentication_bearer_spec.rb
|
109
96
|
- spec/spec_helper.rb
|
110
|
-
homepage:
|
97
|
+
homepage: https://github.com/krainboltgreene/rack-authentication_bearer.rb
|
111
98
|
licenses:
|
112
99
|
- MIT
|
113
100
|
metadata: {}
|
@@ -127,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
114
|
version: '0'
|
128
115
|
requirements: []
|
129
116
|
rubyforge_project:
|
130
|
-
rubygems_version: 2.
|
117
|
+
rubygems_version: 2.7.4
|
131
118
|
signing_key:
|
132
119
|
specification_version: 4
|
133
120
|
summary: Middleware for handling Bearer type Authentication
|
@@ -135,4 +122,3 @@ test_files:
|
|
135
122
|
- spec/lib/rack/authentication_bearer/version_spec.rb
|
136
123
|
- spec/lib/rack/authentication_bearer_spec.rb
|
137
124
|
- spec/spec_helper.rb
|
138
|
-
has_rdoc:
|