rack-oauth2-revibe 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|