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.2.0"

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of TokenAuth.



10
11
12
13
14
# File 'lib/rack/token_auth.rb', line 10

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

Instance Method Details

#call(env) ⇒ Object



16
17
18
19
20
21
22
23
24
25
# File 'lib/rack/token_auth.rb', line 16

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

#default_unauthorized_appObject



39
40
41
# File 'lib/rack/token_auth.rb', line 39

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

#default_unprocessable_header_appObject



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

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

#token_and_options(header) ⇒ Object



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

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 StandardError => exception
      raise UnprocessableHeader, exception
    end
  else
    [nil, {}]
  end
end

#unauthorized_appObject



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

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

#unprocessable_header_appObject



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

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