rack-oauth2-revibe 1.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.gitignore +22 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +7 -0
- data/LICENSE +20 -0
- data/README.rdoc +78 -0
- data/Rakefile +25 -0
- data/VERSION +1 -0
- data/lib/rack/oauth2.rb +67 -0
- data/lib/rack/oauth2/access_token.rb +36 -0
- data/lib/rack/oauth2/access_token/authenticator.rb +24 -0
- data/lib/rack/oauth2/access_token/bearer.rb +11 -0
- data/lib/rack/oauth2/access_token/legacy.rb +23 -0
- data/lib/rack/oauth2/access_token/mac.rb +103 -0
- data/lib/rack/oauth2/access_token/mac/sha256_hex_verifier.rb +17 -0
- data/lib/rack/oauth2/access_token/mac/signature.rb +34 -0
- data/lib/rack/oauth2/access_token/mac/verifier.rb +44 -0
- data/lib/rack/oauth2/client.rb +139 -0
- data/lib/rack/oauth2/client/error.rb +14 -0
- data/lib/rack/oauth2/client/grant.rb +30 -0
- data/lib/rack/oauth2/client/grant/authorization_code.rb +12 -0
- data/lib/rack/oauth2/client/grant/client_credentials.rb +10 -0
- data/lib/rack/oauth2/client/grant/facebook_token.rb +12 -0
- data/lib/rack/oauth2/client/grant/password.rb +11 -0
- data/lib/rack/oauth2/client/grant/refresh_token.rb +11 -0
- data/lib/rack/oauth2/debugger.rb +3 -0
- data/lib/rack/oauth2/debugger/request_filter.rb +30 -0
- data/lib/rack/oauth2/server.rb +4 -0
- data/lib/rack/oauth2/server/abstract.rb +4 -0
- data/lib/rack/oauth2/server/abstract/error.rb +69 -0
- data/lib/rack/oauth2/server/abstract/handler.rb +20 -0
- data/lib/rack/oauth2/server/abstract/request.rb +29 -0
- data/lib/rack/oauth2/server/abstract/response.rb +15 -0
- data/lib/rack/oauth2/server/authorize.rb +117 -0
- data/lib/rack/oauth2/server/authorize/code.rb +39 -0
- data/lib/rack/oauth2/server/authorize/error.rb +71 -0
- data/lib/rack/oauth2/server/authorize/extension.rb +12 -0
- data/lib/rack/oauth2/server/authorize/extension/code_and_token.rb +39 -0
- data/lib/rack/oauth2/server/authorize/token.rb +43 -0
- data/lib/rack/oauth2/server/resource.rb +55 -0
- data/lib/rack/oauth2/server/resource/bearer.rb +47 -0
- data/lib/rack/oauth2/server/resource/bearer/error.rb +24 -0
- data/lib/rack/oauth2/server/resource/error.rb +81 -0
- data/lib/rack/oauth2/server/resource/mac.rb +36 -0
- data/lib/rack/oauth2/server/resource/mac/error.rb +24 -0
- data/lib/rack/oauth2/server/token.rb +87 -0
- data/lib/rack/oauth2/server/token/authorization_code.rb +28 -0
- data/lib/rack/oauth2/server/token/client_credentials.rb +23 -0
- data/lib/rack/oauth2/server/token/error.rb +54 -0
- data/lib/rack/oauth2/server/token/extension.rb +12 -0
- data/lib/rack/oauth2/server/token/extension/jwt.rb +37 -0
- data/lib/rack/oauth2/server/token/facebook_token.rb +27 -0
- data/lib/rack/oauth2/server/token/password.rb +27 -0
- data/lib/rack/oauth2/server/token/refresh_token.rb +26 -0
- data/lib/rack/oauth2/util.rb +58 -0
- data/rack-oauth2.gemspec +30 -0
- data/spec/helpers/time.rb +19 -0
- data/spec/helpers/webmock_helper.rb +41 -0
- data/spec/mock_response/blank +0 -0
- data/spec/mock_response/errors/invalid_request.json +4 -0
- data/spec/mock_response/resources/fake.txt +1 -0
- data/spec/mock_response/tokens/_Bearer.json +6 -0
- data/spec/mock_response/tokens/bearer.json +6 -0
- data/spec/mock_response/tokens/legacy.json +5 -0
- data/spec/mock_response/tokens/legacy.txt +1 -0
- data/spec/mock_response/tokens/legacy_without_expires_in.txt +1 -0
- data/spec/mock_response/tokens/mac.json +8 -0
- data/spec/mock_response/tokens/unknown.json +6 -0
- data/spec/rack/oauth2/access_token/authenticator_spec.rb +43 -0
- data/spec/rack/oauth2/access_token/bearer_spec.rb +18 -0
- data/spec/rack/oauth2/access_token/legacy_spec.rb +23 -0
- data/spec/rack/oauth2/access_token/mac/sha256_hex_verifier_spec.rb +28 -0
- data/spec/rack/oauth2/access_token/mac/signature_spec.rb +59 -0
- data/spec/rack/oauth2/access_token/mac/verifier_spec.rb +25 -0
- data/spec/rack/oauth2/access_token/mac_spec.rb +141 -0
- data/spec/rack/oauth2/access_token_spec.rb +69 -0
- data/spec/rack/oauth2/client/error_spec.rb +18 -0
- data/spec/rack/oauth2/client/grant/authorization_code_spec.rb +37 -0
- data/spec/rack/oauth2/client/grant/client_credentials_spec.rb +7 -0
- data/spec/rack/oauth2/client/grant/password_spec.rb +33 -0
- data/spec/rack/oauth2/client/grant/refresh_token_spec.rb +21 -0
- data/spec/rack/oauth2/client_spec.rb +287 -0
- data/spec/rack/oauth2/debugger/request_filter_spec.rb +33 -0
- data/spec/rack/oauth2/oauth2_spec.rb +74 -0
- data/spec/rack/oauth2/server/abstract/error_spec.rb +59 -0
- data/spec/rack/oauth2/server/authorize/code_spec.rb +57 -0
- data/spec/rack/oauth2/server/authorize/error_spec.rb +103 -0
- data/spec/rack/oauth2/server/authorize/extensions/code_and_token_spec.rb +60 -0
- data/spec/rack/oauth2/server/authorize/token_spec.rb +73 -0
- data/spec/rack/oauth2/server/authorize_spec.rb +214 -0
- data/spec/rack/oauth2/server/resource/bearer/error_spec.rb +52 -0
- data/spec/rack/oauth2/server/resource/bearer_spec.rb +123 -0
- data/spec/rack/oauth2/server/resource/error_spec.rb +147 -0
- data/spec/rack/oauth2/server/resource/mac/error_spec.rb +52 -0
- data/spec/rack/oauth2/server/resource/mac_spec.rb +119 -0
- data/spec/rack/oauth2/server/resource_spec.rb +23 -0
- data/spec/rack/oauth2/server/token/authorization_code_spec.rb +43 -0
- data/spec/rack/oauth2/server/token/client_credentials_spec.rb +23 -0
- data/spec/rack/oauth2/server/token/error_spec.rb +77 -0
- data/spec/rack/oauth2/server/token/password_spec.rb +37 -0
- data/spec/rack/oauth2/server/token/refresh_token_spec.rb +34 -0
- data/spec/rack/oauth2/server/token_spec.rb +134 -0
- data/spec/rack/oauth2/util_spec.rb +97 -0
- data/spec/spec_helper.rb +14 -0
- metadata +326 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
module Rack
|
2
|
+
module OAuth2
|
3
|
+
module Server
|
4
|
+
class Token
|
5
|
+
class FacebookToken < Abstract::Handler
|
6
|
+
def call(env)
|
7
|
+
@request = Request.new(env)
|
8
|
+
@response = Response.new(request)
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
class Request < Token::Request
|
13
|
+
attr_required :facebook_token
|
14
|
+
|
15
|
+
def initialize(env)
|
16
|
+
super
|
17
|
+
@grant_type = :facebook_token
|
18
|
+
@facebook_token = params['facebook_token']
|
19
|
+
attr_missing!
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Rack
|
2
|
+
module OAuth2
|
3
|
+
module Server
|
4
|
+
class Token
|
5
|
+
class Password < Abstract::Handler
|
6
|
+
def call(env)
|
7
|
+
@request = Request.new(env)
|
8
|
+
@response = Response.new(request)
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
class Request < Token::Request
|
13
|
+
attr_required :username, :password
|
14
|
+
|
15
|
+
def initialize(env)
|
16
|
+
super
|
17
|
+
@grant_type = :password
|
18
|
+
@username = params['username']
|
19
|
+
@password = params['password']
|
20
|
+
attr_missing!
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Rack
|
2
|
+
module OAuth2
|
3
|
+
module Server
|
4
|
+
class Token
|
5
|
+
class RefreshToken < Abstract::Handler
|
6
|
+
def call(env)
|
7
|
+
@request = Request.new(env)
|
8
|
+
@response = Response.new(request)
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
class Request < Token::Request
|
13
|
+
attr_required :refresh_token
|
14
|
+
|
15
|
+
def initialize(env)
|
16
|
+
super
|
17
|
+
@grant_type = :refresh_token
|
18
|
+
@refresh_token = params['refresh_token']
|
19
|
+
attr_missing!
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
3
|
+
module Rack
|
4
|
+
module OAuth2
|
5
|
+
module Util
|
6
|
+
class << self
|
7
|
+
def rfc3986_encode(text)
|
8
|
+
URI.encode(text, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
9
|
+
end
|
10
|
+
|
11
|
+
def base64_encode(text)
|
12
|
+
Base64.encode64(text).gsub(/\n/, '')
|
13
|
+
end
|
14
|
+
|
15
|
+
def compact_hash(hash)
|
16
|
+
hash.reject do |key, value|
|
17
|
+
value.blank?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def parse_uri(uri)
|
22
|
+
case uri
|
23
|
+
when URI::Generic
|
24
|
+
uri
|
25
|
+
when String
|
26
|
+
URI.parse(uri)
|
27
|
+
else
|
28
|
+
raise "Invalid format of URI is given."
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def redirect_uri(base_uri, location, params)
|
33
|
+
redirect_uri = parse_uri base_uri
|
34
|
+
case location
|
35
|
+
when :query
|
36
|
+
redirect_uri.query = [redirect_uri.query, Util.compact_hash(params).to_query].compact.join('&')
|
37
|
+
when :fragment
|
38
|
+
redirect_uri.fragment = Util.compact_hash(params).to_query
|
39
|
+
end
|
40
|
+
redirect_uri.to_s
|
41
|
+
end
|
42
|
+
|
43
|
+
def uri_match?(base, given)
|
44
|
+
base = parse_uri(base)
|
45
|
+
given = parse_uri(given)
|
46
|
+
base.path = '/' if base.path.blank?
|
47
|
+
given.path = '/' if given.path.blank?
|
48
|
+
[:scheme, :host, :port].all? do |key|
|
49
|
+
base.send(key) == given.send(key)
|
50
|
+
end && /^#{base.path}/ =~ given.path
|
51
|
+
rescue
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/rack-oauth2.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "rack-oauth2-revibe"
|
3
|
+
s.version = File.read("VERSION")
|
4
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6") if s.respond_to? :required_rubygems_version=
|
5
|
+
s.authors = ["nov matake"]
|
6
|
+
s.description = %q{OAuth 2.0 Server & Client Library. Both Bearer and MAC token type are supported.}
|
7
|
+
s.summary = %q{OAuth 2.0 Server & Client Library - Both Bearer and MAC token type are supported}
|
8
|
+
s.email = "nov@matake.jp"
|
9
|
+
s.extra_rdoc_files = ["LICENSE", "README.rdoc"]
|
10
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
11
|
+
s.homepage = "http://github.com/nov/rack-oauth2"
|
12
|
+
s.license = 'MIT'
|
13
|
+
s.require_paths = ["lib"]
|
14
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.add_runtime_dependency "rack", ">= 1.1"
|
18
|
+
s.add_runtime_dependency "multi_json", ">= 1.3.6"
|
19
|
+
s.add_runtime_dependency "httpclient", ">= 2.2.0.2"
|
20
|
+
s.add_runtime_dependency "activesupport", ">= 2.3"
|
21
|
+
s.add_runtime_dependency "attr_required", ">= 0.0.5"
|
22
|
+
s.add_development_dependency "rake", ">= 0.8"
|
23
|
+
if RUBY_VERSION >= '1.9'
|
24
|
+
s.add_development_dependency "cover_me", ">= 1.2.0"
|
25
|
+
else
|
26
|
+
s.add_development_dependency "rcov", ">= 0.9"
|
27
|
+
end
|
28
|
+
s.add_development_dependency "rspec", ">= 2"
|
29
|
+
s.add_development_dependency "webmock", ">= 1.6.2"
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Time
|
2
|
+
class << self
|
3
|
+
def now_with_fixed_time
|
4
|
+
if @fixed_time
|
5
|
+
@fixed_time.dup
|
6
|
+
else
|
7
|
+
now_without_fixed_time
|
8
|
+
end
|
9
|
+
end
|
10
|
+
alias_method_chain :now, :fixed_time
|
11
|
+
|
12
|
+
def fix(time = Time.now)
|
13
|
+
@fixed_time = time
|
14
|
+
yield
|
15
|
+
ensure
|
16
|
+
@fixed_time = nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'webmock/rspec'
|
2
|
+
|
3
|
+
module WebMockHelper
|
4
|
+
def mock_response(method, endpoint, response_file, options = {})
|
5
|
+
stub_request(method, endpoint).with(
|
6
|
+
request_for(method, options)
|
7
|
+
).to_return(
|
8
|
+
response_for(response_file, options)
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def request_for(method, options = {})
|
15
|
+
request = {}
|
16
|
+
if options[:params]
|
17
|
+
case method
|
18
|
+
when :post, :put
|
19
|
+
request[:body] = options[:params]
|
20
|
+
else
|
21
|
+
request[:query] = options[:params]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
if options[:request_header]
|
25
|
+
request[:headers] = options[:request_header]
|
26
|
+
end
|
27
|
+
request
|
28
|
+
end
|
29
|
+
|
30
|
+
def response_for(response_file, options = {})
|
31
|
+
response = {}
|
32
|
+
response[:body] = File.new(File.join(File.dirname(__FILE__), '../mock_response', response_file))
|
33
|
+
if options[:status]
|
34
|
+
response[:status] = options[:status]
|
35
|
+
end
|
36
|
+
response
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
include WebMockHelper
|
41
|
+
WebMock.disable_net_connect!
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
fake
|
@@ -0,0 +1 @@
|
|
1
|
+
access_token=access_token&expires=3600
|
@@ -0,0 +1 @@
|
|
1
|
+
access_token=access_token
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rack::OAuth2::AccessToken::Authenticator do
|
4
|
+
let(:resource_endpoint) { 'https://server.example.com/resources/fake' }
|
5
|
+
let(:request) { HTTP::Message.new_request(:get, URI.parse(resource_endpoint)) }
|
6
|
+
let(:authenticator) { Rack::OAuth2::AccessToken::Authenticator.new(token) }
|
7
|
+
|
8
|
+
shared_examples_for :authenticator do
|
9
|
+
it 'should let the token authenticate the request' do
|
10
|
+
token.should_receive(:authenticate).with(request)
|
11
|
+
authenticator.filter_request(request)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when Legacy token is given' do
|
16
|
+
let(:token) do
|
17
|
+
Rack::OAuth2::AccessToken::Legacy.new(
|
18
|
+
:access_token => 'access_token'
|
19
|
+
)
|
20
|
+
end
|
21
|
+
it_behaves_like :authenticator
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when Bearer token is given' do
|
25
|
+
let(:token) do
|
26
|
+
Rack::OAuth2::AccessToken::Bearer.new(
|
27
|
+
:access_token => 'access_token'
|
28
|
+
)
|
29
|
+
end
|
30
|
+
it_behaves_like :authenticator
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when MAC token is given' do
|
34
|
+
let(:token) do
|
35
|
+
Rack::OAuth2::AccessToken::MAC.new(
|
36
|
+
:access_token => 'access_token',
|
37
|
+
:mac_key => 'secret',
|
38
|
+
:mac_algorithm => 'hmac-sha-256'
|
39
|
+
)
|
40
|
+
end
|
41
|
+
it_behaves_like :authenticator
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rack::OAuth2::AccessToken::Bearer do
|
4
|
+
let :token do
|
5
|
+
Rack::OAuth2::AccessToken::Bearer.new(
|
6
|
+
:access_token => 'access_token'
|
7
|
+
)
|
8
|
+
end
|
9
|
+
let(:resource_endpoint) { 'https://server.example.com/resources/fake' }
|
10
|
+
let(:request) { HTTPClient.new.send(:create_request, :post, URI.parse(resource_endpoint), {}, {:hello => "world"}, {}) }
|
11
|
+
|
12
|
+
describe '.authenticate' do
|
13
|
+
it 'should set Authorization header' do
|
14
|
+
request.header.should_receive(:[]=).with('Authorization', 'Bearer access_token')
|
15
|
+
token.authenticate(request)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rack::OAuth2::AccessToken::Legacy do
|
4
|
+
let :token do
|
5
|
+
Rack::OAuth2::AccessToken::Legacy.new(
|
6
|
+
:access_token => 'access_token'
|
7
|
+
)
|
8
|
+
end
|
9
|
+
let(:resource_endpoint) { 'https://server.example.com/resources/fake' }
|
10
|
+
let(:request) { HTTPClient.new.send(:create_request, :post, URI.parse(resource_endpoint), {}, {:hello => "world"}, {}) }
|
11
|
+
|
12
|
+
describe '#to_s' do
|
13
|
+
subject { token }
|
14
|
+
its(:to_s) { should == token.access_token }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.authenticate' do
|
18
|
+
it 'should set Authorization header' do
|
19
|
+
request.header.should_receive(:[]=).with('Authorization', 'OAuth access_token')
|
20
|
+
token.authenticate(request)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rack::OAuth2::AccessToken::MAC::Sha256HexVerifier do
|
4
|
+
|
5
|
+
# From the example of webtopay wallet API spec
|
6
|
+
# ref) https://www.webtopay.com/wallet/#authentication
|
7
|
+
context 'when example from webtopay wallet API' do
|
8
|
+
subject do
|
9
|
+
Rack::OAuth2::AccessToken::MAC::Sha256HexVerifier.new(
|
10
|
+
:algorithm => 'hmac-sha-256',
|
11
|
+
:raw_body => 'grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=http%3A%2F%2Flocalhost%2Fabc'
|
12
|
+
)
|
13
|
+
end
|
14
|
+
its(:calculate) { should == '21fb73c40b589622d0c78e9cd8900f89d9472aa724d0e5c3eca9ac1cd9d2a6d5' }
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
context 'when raw_body is empty' do
|
19
|
+
subject do
|
20
|
+
Rack::OAuth2::AccessToken::MAC::Sha256HexVerifier.new(
|
21
|
+
:algorithm => 'hmac-sha-256',
|
22
|
+
:raw_body => ''
|
23
|
+
)
|
24
|
+
end
|
25
|
+
its(:calculate) { should be_nil }
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rack::OAuth2::AccessToken::MAC::Signature do
|
4
|
+
# From the example of Webtopay wallet API
|
5
|
+
# ref) https://www.webtopay.com/wallet/
|
6
|
+
context 'when ext is not given' do
|
7
|
+
subject do
|
8
|
+
Rack::OAuth2::AccessToken::MAC::Signature.new(
|
9
|
+
:secret => 'IrdTc8uQodU7PRpLzzLTW6wqZAO6tAMU',
|
10
|
+
:algorithm => 'hmac-sha-256',
|
11
|
+
:nonce => 'dj83hs9s',
|
12
|
+
:ts => 1336363200,
|
13
|
+
:method => 'GET',
|
14
|
+
:request_uri => '/wallet/rest/api/v1/payment/123',
|
15
|
+
:host => 'www.webtopay.com',
|
16
|
+
:port => 443
|
17
|
+
)
|
18
|
+
end
|
19
|
+
its(:calculate) { should == 'OZE9fTk2qiRtL1jb01L8lRxC66PTiAGhMDEmboeVeLs=' }
|
20
|
+
end
|
21
|
+
|
22
|
+
# From the example of MAC spec section 1.1
|
23
|
+
# ref) http://tools.ietf.org/pdf/draft-ietf-oauth-v2-http-mac-01.pdf
|
24
|
+
context 'when ext is not given' do
|
25
|
+
subject do
|
26
|
+
Rack::OAuth2::AccessToken::MAC::Signature.new(
|
27
|
+
:secret => '489dks293j39',
|
28
|
+
:algorithm => 'hmac-sha-1',
|
29
|
+
:nonce => 'dj83hs9s',
|
30
|
+
:ts => 1336363200,
|
31
|
+
:method => 'GET',
|
32
|
+
:request_uri => '/resource/1?b=1&a=2',
|
33
|
+
:host => 'example.com',
|
34
|
+
:port => 80
|
35
|
+
)
|
36
|
+
end
|
37
|
+
its(:calculate) { should == '6T3zZzy2Emppni6bzL7kdRxUWL4=' }
|
38
|
+
end
|
39
|
+
|
40
|
+
# From the example of MAC spec section 3.2
|
41
|
+
# ref) http://tools.ietf.org/pdf/draft-ietf-oauth-v2-http-mac-01.pdf
|
42
|
+
context 'otherwise' do
|
43
|
+
subject do
|
44
|
+
Rack::OAuth2::AccessToken::MAC::Signature.new(
|
45
|
+
:secret => '489dks293j39',
|
46
|
+
:algorithm => 'hmac-sha-1',
|
47
|
+
:nonce => '7d8f3e4a',
|
48
|
+
:ts => 264095,
|
49
|
+
:method => 'POST',
|
50
|
+
:request_uri => '/request?b5=%3D%253D&a3=a&c%40=&a2=r%20b&c2&a3=2+q',
|
51
|
+
:host => 'example.com',
|
52
|
+
:port => 80,
|
53
|
+
:ext => 'a,b,c'
|
54
|
+
)
|
55
|
+
end
|
56
|
+
its(:calculate) { should == '+txL5oOFHGYjrfdNYH5VEzROaBY=' }
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|