diff --git a/lib/rack/oauth2/server/abstract/error.rb b/lib/rack/oauth2/server/abstract/error.rb index 2ff698c..7ef9417 100644 --- a/lib/rack/oauth2/server/abstract/error.rb +++ b/lib/rack/oauth2/server/abstract/error.rb @@ -3,7 +3,7 @@ module OAuth2 module Server module Abstract class Error < StandardError - attr_accessor :status, :error, :description, :uri, :realm + attr_accessor :status, :error, :description, :uri, :realm, :resource_metadata def initialize(status, error, description = nil, options = {}) @status = status @@ -11,6 +11,7 @@ def initialize(status, error, description = nil, options = {}) @description = description @uri = options[:uri] @realm = options[:realm] + @resource_metadata = options[:resource_metadata] super [error, description].compact.join(' :: ') end diff --git a/lib/rack/oauth2/server/resource/error.rb b/lib/rack/oauth2/server/resource/error.rb index c74a8e3..84577ad 100644 --- a/lib/rack/oauth2/server/resource/error.rb +++ b/lib/rack/oauth2/server/resource/error.rb @@ -19,6 +19,7 @@ def finish headers << ", error_description=\"#{description}\"" if description.present? headers << ", error_uri=\"#{uri}\"" if uri.present? end + headers << ", resource_metadata=\"#{resource_metadata}\"" if resource_metadata.present? end end end diff --git a/spec/rack/oauth2/server/resource/error_spec.rb b/spec/rack/oauth2/server/resource/error_spec.rb index b9f1469..674e1c0 100644 --- a/spec/rack/oauth2/server/resource/error_spec.rb +++ b/spec/rack/oauth2/server/resource/error_spec.rb @@ -77,6 +77,17 @@ def scheme response.first.should include '"error":"something"' end end + + context 'when resource_metadata is specified' do + let(:resource_metadata) { "https://resource.example.com/.well-known/oauth-protected-resource" } + let(:error) { Rack::OAuth2::Server::Resource::Bearer::Unauthorized.new(:something, nil, resource_metadata: resource_metadata) } + + it 'should include resource_metadata in WWW-Authenticate header' do + _, headers, response = error_with_scheme.finish + headers['WWW-Authenticate'].should include %(resource_metadata="#{resource_metadata}") + response.first.should include '"error":"something"' + end + end end end end