Skip to content

Commit 89f6fc8

Browse files
committed
Reimplement auth scheme fix
* Add Rack::Auth.add_scheme to enable folks to fix anything that breaks * Add common auth schemes, MS ones, AWS ones, etc are missing, as unlikely * Checked Rails - they don't use our authorization code * Checked Warden - uses rails * Checked Omniauth - uses rails * Checked doorkeeper - users rails * Checked rack-authentication - does it's own thing * Checked warden-oauth - doesn't do headers * Checked devise - uses rails * Checked oauth2-rack - header creation only * Checked rack-oauth2-server - does it's own thing * Probably missed a bunch, but that'll have to do
1 parent 231d1a9 commit 89f6fc8

File tree

3 files changed

+74
-1
lines changed

3 files changed

+74
-1
lines changed

lib/rack.rb

+12
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,18 @@ module Digest
7373
autoload :Params, "rack/auth/digest/params"
7474
autoload :Request, "rack/auth/digest/request"
7575
end
76+
77+
# Not all of the following schemes are "standards", but they are used often.
78+
@schemes = %w[basic digest bearer mac token oauth oauth2]
79+
80+
def self.add_scheme scheme
81+
@schemes << scheme
82+
@schemes.uniq!
83+
end
84+
85+
def self.schemes
86+
@schemes.dup
87+
end
7688
end
7789

7890
module Session

lib/rack/auth/abstract/request.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ def parts
2121
end
2222

2323
def scheme
24-
@scheme ||= parts.first.downcase.to_sym
24+
@scheme ||=
25+
begin
26+
s = parts.first.downcase
27+
Rack::Auth.schemes.include?(s) ? s.to_sym : s
28+
end
2529
end
2630

2731
def params

test/spec_auth.rb

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
require 'rack'
2+
3+
describe Rack::Auth do
4+
it "should have all common authentication schemes" do
5+
Rack::Auth.schemes.should.include? 'basic'
6+
Rack::Auth.schemes.should.include? 'digest'
7+
Rack::Auth.schemes.should.include? 'bearer'
8+
Rack::Auth.schemes.should.include? 'token'
9+
end
10+
11+
it "should allow registration of new auth schemes" do
12+
Rack::Auth.schemes.should.not.include "test"
13+
Rack::Auth.add_scheme "test"
14+
Rack::Auth.schemes.should.include "test"
15+
end
16+
end
17+
18+
describe Rack::Auth::AbstractRequest do
19+
it "should symbolize known auth schemes" do
20+
env = Rack::MockRequest.env_for('/')
21+
env['HTTP_AUTHORIZATION'] = 'Basic aXJyZXNwb25zaWJsZQ=='
22+
req = Rack::Auth::AbstractRequest.new(env)
23+
req.scheme.should == :basic
24+
25+
26+
env['HTTP_AUTHORIZATION'] = 'Digest aXJyZXNwb25zaWJsZQ=='
27+
req = Rack::Auth::AbstractRequest.new(env)
28+
req.scheme.should == :digest
29+
30+
env['HTTP_AUTHORIZATION'] = 'Bearer aXJyZXNwb25zaWJsZQ=='
31+
req = Rack::Auth::AbstractRequest.new(env)
32+
req.scheme.should == :bearer
33+
34+
env['HTTP_AUTHORIZATION'] = 'MAC aXJyZXNwb25zaWJsZQ=='
35+
req = Rack::Auth::AbstractRequest.new(env)
36+
req.scheme.should == :mac
37+
38+
env['HTTP_AUTHORIZATION'] = 'Token aXJyZXNwb25zaWJsZQ=='
39+
req = Rack::Auth::AbstractRequest.new(env)
40+
req.scheme.should == :token
41+
42+
env['HTTP_AUTHORIZATION'] = 'OAuth aXJyZXNwb25zaWJsZQ=='
43+
req = Rack::Auth::AbstractRequest.new(env)
44+
req.scheme.should == :oauth
45+
46+
env['HTTP_AUTHORIZATION'] = 'OAuth2 aXJyZXNwb25zaWJsZQ=='
47+
req = Rack::Auth::AbstractRequest.new(env)
48+
req.scheme.should == :oauth2
49+
end
50+
51+
it "should not symbolize unknown auth schemes" do
52+
env = Rack::MockRequest.env_for('/')
53+
env['HTTP_AUTHORIZATION'] = 'magic aXJyZXNwb25zaWJsZQ=='
54+
req = Rack::Auth::AbstractRequest.new(env)
55+
req.scheme.should == "magic"
56+
end
57+
end

0 commit comments

Comments
 (0)