Class: Rack::TokenAuth

Inherits:
Object
  • Object
show all
Defined in:
lib/rack/token_auth.rb,
lib/rack/token_auth/version.rb

Constant Summary collapse

UnprocessableHeader =
Class.new(ArgumentError)
VERSION =
"0.0.1"

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}, &block) ⇒ TokenAuth

Returns a new instance of TokenAuth.



8
9
10
11
12
# File 'lib/rack/token_auth.rb', line 8

def initialize(app, options = {}, &block)
  @app     = app
  @options = options
  @block   = block
end

Instance Method Details

#call(env) ⇒ Object



14
15
16
17
18
19
20
21
22
# File 'lib/rack/token_auth.rb', line 14

def call(env)
  if @block.call(*token_and_options(env["HTTP_AUTHORIZATION"]))
    @app.call(env)
  else
    unauthorized_app.call(env)
  end
rescue UnprocessableHeader => error
  unprocessable_header_app.call(env)
end

#default_unauthorized_appObject



36
37
38
# File 'lib/rack/token_auth.rb', line 36

def default_unauthorized_app
  lambda { |env| Rack::Response.new("Unauthorized", 401) }
end

#default_unprocessable_header_appObject



32
33
34
# File 'lib/rack/token_auth.rb', line 32

def default_unprocessable_header_app
  lambda { |env| Rack::Response.new("Unprocessable Authorization header", 400) }
end

#token_and_options(header) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/rack/token_auth.rb', line 42

def token_and_options(header)
  token = header.to_s.match(/^Token (.*)/) { |m| m[1] }
  if token
    begin
      values = Hash[token.split(',').map do |value|
        value.strip!                      # remove any spaces between commas and values
        key, value = value.split(/\=\"?/) # split key=value pairs
        value.chomp!('"')                 # chomp trailing " in value
        value.gsub!(/\\\"/, '"')          # unescape remaining quotes
        [key, value]
      end]
      [values.delete("token"), values]
    rescue => error
      raise UnprocessableHeader, error
    end
  else
    [nil,{}]
  end
end

#unauthorized_appObject



24
25
26
# File 'lib/rack/token_auth.rb', line 24

def unauthorized_app
  @options.fetch(:unauthorized_app) { default_unauthorized_app }
end

#unprocessable_header_appObject



28
29
30
# File 'lib/rack/token_auth.rb', line 28

def unprocessable_header_app
  @options.fetch(:unprocessable_header_app) { default_unprocessable_header_app }
end