diff --git a/lib/omniauth/strategies/apple.rb b/lib/omniauth/strategies/apple.rb index 5ad3a40..285c259 100644 --- a/lib/omniauth/strategies/apple.rb +++ b/lib/omniauth/strategies/apple.rb @@ -2,6 +2,7 @@ require 'omniauth-oauth2' require 'json/jwt' +require 'pry' module OmniAuth module Strategies @@ -60,7 +61,7 @@ def authorize_params end def callback_url - options[:redirect_uri] || (full_host + callback_path) + request.params['redirect_uri'] || options[:redirect_uri] || (full_host + callback_path) end private diff --git a/omniauth-apple.gemspec b/omniauth-apple.gemspec index e6ec42f..4205cd0 100644 --- a/omniauth-apple.gemspec +++ b/omniauth-apple.gemspec @@ -39,6 +39,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'omniauth-oauth2' spec.add_dependency 'json-jwt' spec.add_development_dependency "bundler", "~> 2.0" + spec.add_development_dependency "pry", "~> 0.15.0" spec.add_development_dependency "rake", "~> 13.0" spec.add_development_dependency "rspec", "~> 3.9" spec.add_development_dependency "webmock", "~> 3.8" diff --git a/spec/omniauth/strategies/apple_spec.rb b/spec/omniauth/strategies/apple_spec.rb index 2709d1b..111c226 100644 --- a/spec/omniauth/strategies/apple_spec.rb +++ b/spec/omniauth/strategies/apple_spec.rb @@ -204,18 +204,31 @@ end describe '#callback_url' do - let(:base_url) { 'https://example.com' } + let(:full_host) { 'https://example.com' } + let (:params_redirect_uri) { 'https://your.client.domain/callback' } + let(:redirect_uri) { 'https://your.api.domain/callback' } + let (:script_name) { '/v1' } - it 'has the correct default callback path' do - allow(subject).to receive(:full_host) { base_url } - allow(subject).to receive(:script_name) { '' } - expect(subject.send(:callback_url)).to eq(base_url + '/auth/apple/callback') + before do + allow(subject).to receive_messages(full_host:) + allow(subject).to receive_messages(script_name:) + end + + it 'returns the `request.params[:redirect_uri]` when present' do + request = double('Request', params: { "redirect_uri" => params_redirect_uri }, cookies: {}, env: {}) + allow(subject).to receive_messages(request:) + subject.options.merge!({ redirect_uri: }) + + expect(subject.send(:callback_url)).to eq params_redirect_uri + end + + it "returns the `options[:redirect_uri]` when present and `request.params[:redirect_uri]` is blank" do + subject.options.merge!({ redirect_uri: }) + expect(subject.send(:callback_url)).to eq redirect_uri end - it 'should set the callback path with script_name if present' do - allow(subject).to receive(:full_host) { base_url } - allow(subject).to receive(:script_name) { '/v1' } - expect(subject.send(:callback_url)).to eq(base_url + '/v1/auth/apple/callback') + it 'defaults to the callback_path when `options[:redirect_uri]` and `request.params[:redirect_uri]` are blank' do + expect(subject.send(:callback_url)).to eq "#{full_host}#{script_name}/auth/apple/callback" end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index b869d3c..4201e2f 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -10,3 +10,5 @@ require 'webmock/rspec' WebMock.disable_net_connect! + +require 'pry'