diff --git a/agrirouter-sdk-dotnet-standard-impl/Service/Onboard/AuthorizationService.cs b/agrirouter-sdk-dotnet-standard-impl/Service/Onboard/AuthorizationService.cs index cc8bcff..04dd67a 100644 --- a/agrirouter-sdk-dotnet-standard-impl/Service/Onboard/AuthorizationService.cs +++ b/agrirouter-sdk-dotnet-standard-impl/Service/Onboard/AuthorizationService.cs @@ -61,14 +61,43 @@ public AuthorizationUrlResult AuthorizationUrl(string applicationId) public AuthorizationUrlResult AuthorizationUrl(string applicationId, string redirectUri) { var state = Guid.NewGuid().ToString(); + var authorizationUrl = GenerateAuthorizationUrlForState(applicationId, state, redirectUri); + return new AuthorizationUrlResult { - AuthorizationUrl = - $"{_environment.AuthorizationUrl(applicationId)}?response_type=onboard&state={state}&redirect_uri={redirectUri}", + AuthorizationUrl = authorizationUrl, State = state }; } + + /// + /// Generates the authorization URL for the application used within the onboarding process and adds the redirect URI + /// parameter. + /// + /// The application ID for the authorization. + /// A predefined identifier for the state (used by the external application). + /// The redirect URI. + /// - + public AuthorizationUrlResult AuthorizationUrlForState(string applicationId, Guid state, string redirectUri) + { + var stateAsString = state.ToString(); + var authorizationUrl = GenerateAuthorizationUrlForState(applicationId, stateAsString, redirectUri); + + return new AuthorizationUrlResult + { + AuthorizationUrl = authorizationUrl, + State = stateAsString + }; + } + + private string GenerateAuthorizationUrlForState(string applicationId, string state, string redirectUri) + { + return string.IsNullOrEmpty(redirectUri) + ? $"{_environment.AuthorizationUrl(applicationId)}?response_type=onboard&state={state}" + : $"{_environment.AuthorizationUrl(applicationId)}?response_type=onboard&state={state}&redirect_uri={redirectUri}"; + } + /// /// Parsing the result which was attached as parameters to the URL. /// @@ -82,6 +111,7 @@ public AuthorizationResult Parse(string authorizationResult) { throw new ArgumentException($"The input '{authorizationResult}' does not meet the specification"); } + return new AuthorizationResult { State = parameters.Get("state"), @@ -99,7 +129,7 @@ public AuthorizationResult Parse(string authorizationResult) /// Will be thrown if the input is not valid. public AuthorizationResult Parse(Uri callbackUri) { - return Parse(callbackUri.Query); + return Parse(callbackUri.Query); } /// @@ -110,7 +140,7 @@ public AuthorizationResult Parse(Uri callbackUri) public AuthorizationToken Parse(AuthorizationResult authorizationResult) { return - (AuthorizationToken) JsonConvert.DeserializeObject( + (AuthorizationToken)JsonConvert.DeserializeObject( Encoding.UTF8.GetString(Convert.FromBase64String(authorizationResult.Token)), typeof(AuthorizationToken)); } @@ -128,7 +158,7 @@ public bool Verify(string state, string token, string signature) { var signer = SignerUtilities.GetSigner(Algorithm); signer.Init(false, - (RsaKeyParameters) new PemReader(new StringReader(_environment.PublicKey())).ReadObject()); + (RsaKeyParameters)new PemReader(new StringReader(_environment.PublicKey())).ReadObject()); signer.BlockUpdate(Encoding.UTF8.GetBytes(concatenatedValues), 0, concatenatedValues.Length); return signer.VerifySignature(Base64.Decode(signature)); } diff --git a/agrirouter-sdk-dotnet-standard-test/Data/OnboardingResponses/Http/EnableAllCapabilitiesForOnboardingResponsesTest.cs b/agrirouter-sdk-dotnet-standard-test/Data/OnboardingResponses/Http/EnableAllCapabilitiesForOnboardingResponsesTest.cs index 54cc816..eb2fc4c 100644 --- a/agrirouter-sdk-dotnet-standard-test/Data/OnboardingResponses/Http/EnableAllCapabilitiesForOnboardingResponsesTest.cs +++ b/agrirouter-sdk-dotnet-standard-test/Data/OnboardingResponses/Http/EnableAllCapabilitiesForOnboardingResponsesTest.cs @@ -1,16 +1,13 @@ using System; using System.Collections.Generic; -using System.Threading; -using Agrirouter.Request.Payload.Endpoint; using Agrirouter.Api.Service.Parameters; using Agrirouter.Api.Service.Parameters.Inner; using Agrirouter.Impl.Service.Common; using Agrirouter.Impl.Service.Messaging; +using Agrirouter.Request.Payload.Endpoint; using Agrirouter.Test.Helper; -using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client; using Serilog; using Xunit; -using Timer = Agrirouter.Test.Helper.Timer; namespace Agrirouter.Test.Data.OnboardingResponses.Http { @@ -50,7 +47,7 @@ public void } catch (Exception e) { - Log.Error("Exception while sending capabilities message for {}", onboardResponse.SensorAlternateId); + Log.Error(e,"Exception while sending capabilities message for {}", onboardResponse.SensorAlternateId); } }); @@ -84,7 +81,7 @@ public void } catch (Exception e) { - Log.Error("Exception while sending capabilities message for {}", onboardResponse.SensorAlternateId); + Log.Error(e,"Exception while sending capabilities message for {}", onboardResponse.SensorAlternateId); } }); } diff --git a/agrirouter-sdk-dotnet-standard-test/Service/Onboard/AuthorizationServiceTest.cs b/agrirouter-sdk-dotnet-standard-test/Service/Onboard/AuthorizationServiceTest.cs index 6942192..59a9b15 100644 --- a/agrirouter-sdk-dotnet-standard-test/Service/Onboard/AuthorizationServiceTest.cs +++ b/agrirouter-sdk-dotnet-standard-test/Service/Onboard/AuthorizationServiceTest.cs @@ -25,6 +25,21 @@ public void authorizationUrlResult.AuthorizationUrl); } + + [Fact] + public void + GivenValidApplicationIdAndUuidAndRedirectUriWhenCreatingAuthorizationUrlThenTheUrlShouldBeFineDuringManualTesting() + { + var authorizationService = new AuthorizationService(new QualityAssuranceEnvironment()); + var uuid = Guid.NewGuid(); + var authorizationUrlResult = + authorizationService.AuthorizationUrlForState(ApplicationId, uuid,"https://www.dev4Agriculture.de"); + Assert.Equal( + $"https://agrirouter-qa.cfapps.eu10.hana.ondemand.com/application/16b1c3ab-55ef-412c-952b-f280424272e1/authorize?response_type=onboard&state={uuid}&redirect_uri=https://www.dev4Agriculture.de", + authorizationUrlResult.AuthorizationUrl); + } + + [Fact] public void GivenValidApplicationIdWhenCreatingAuthorizationUrlThenTheUrlShouldBeFineDuringManualTesting() {