diff --git a/clients/sellingpartner-api-aa-csharp/Config b/clients/sellingpartner-api-aa-csharp/Config new file mode 100644 index 00000000..e70e978f --- /dev/null +++ b/clients/sellingpartner-api-aa-csharp/Config @@ -0,0 +1,26 @@ +package.SellingPartnerAPIAuthAndAuthCSharp = { + interfaces = (1.0); + + # Use NoOpBuild. See https://w.amazon.com/index.php/BrazilBuildSystem/NoOpBuild + build-system = no-op; + build-tools = { + 1.0 = { + NoOpBuild = 1.0; + }; + }; + + # Use runtime-dependencies for when you want to bring in additional + # packages when deploying. + # Use dependencies instead if you intend for these dependencies to + # be exported to other packages that build against you. + dependencies = { + 1.0 = { + }; + }; + + runtime-dependencies = { + 1.0 = { + }; + }; + +}; diff --git a/clients/sellingpartner-api-aa-csharp/README.md b/clients/sellingpartner-api-aa-csharp/README.md index a58a97c6..2e156f50 100644 --- a/clients/sellingpartner-api-aa-csharp/README.md +++ b/clients/sellingpartner-api-aa-csharp/README.md @@ -42,6 +42,8 @@ Note the IRestRequest reference is treated as **mutable** when signed. Signs a request with [AWS Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) using the provided AWS developer account credentials. +This implementation of the IAM Role-based Authentication, will work only as long as the initial STS Token is valid (typically for 3600 seconds) and until an instance is able to refresh the STS Token on its own, otherwise, the Token needs to be reinitialized via the AWSSigV4Signer. + *Example* ``` using RestSharp; @@ -58,7 +60,13 @@ AWSAuthenticationCredentials awsAuthenticationCredentials = new AWSAuthenticatio Region = "..." }; -restRequest = new AWSSigV4Signer(awsAuthenticationCredentials) +AWSAuthenticationCredentialsProvider awsAuthenticationCredentialsProvider = new AWSAuthenticationCredentialsProvider +{ + RoleArn = "...", + RoleSessionName = "..." +}; + +restRequest = new AWSSigV4Signer(awsAuthenticationCredentials, awsAuthenticationCredentialsProvider) .Sign(restRequest, restClient.BaseUrl.Host); ``` Note the IRestRequest reference is treated as **mutable** when signed. @@ -75,6 +83,8 @@ All dependencies can be installed via NuGet - RestSharp - 105.1.0 - Newtonsoft.Json 12.0.3 - NETStandard.Library 2.0.3 (platform-specific implementation requirements are documented on the [Microsoft .NET Guide](https://docs.microsoft.com/en-us/dotnet/standard/net-standard)) +- AWSSDK.Core 3.5.1.23 +- AWSSDK.SecurityToken 3.5.1.5 ## License Swagger Codegen templates are subject to the [Swagger Codegen License](https://github.com/swagger-api/swagger-codegen#license). diff --git a/clients/sellingpartner-api-aa-csharp/SellingPartnerAPIAuthAndAuthCSharp.sln b/clients/sellingpartner-api-aa-csharp/SellingPartnerAPIAuthAndAuthCSharp.sln index bdbc9021..cb6582ed 100644 --- a/clients/sellingpartner-api-aa-csharp/SellingPartnerAPIAuthAndAuthCSharp.sln +++ b/clients/sellingpartner-api-aa-csharp/SellingPartnerAPIAuthAndAuthCSharp.sln @@ -1,23 +1,23 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amazon.SellingPartnerAPIAA", "src\Amazon.SellingPartnerAPIAA\Amazon.SellingPartnerAPIAA.csproj", "{64339397-3AAB-49D3-8B50-7A467B16D545}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amazon.SellingPartnerAPIAATests", "test\Amazon.SellingPartnerAPIAATests\Amazon.SellingPartnerAPIAATests.csproj", "{12B130EB-1087-4F88-BDFA-3088868C0A46}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {64339397-3AAB-49D3-8B50-7A467B16D545}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {64339397-3AAB-49D3-8B50-7A467B16D545}.Debug|Any CPU.Build.0 = Debug|Any CPU - {64339397-3AAB-49D3-8B50-7A467B16D545}.Release|Any CPU.ActiveCfg = Release|Any CPU - {64339397-3AAB-49D3-8B50-7A467B16D545}.Release|Any CPU.Build.0 = Release|Any CPU - {12B130EB-1087-4F88-BDFA-3088868C0A46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {12B130EB-1087-4F88-BDFA-3088868C0A46}.Debug|Any CPU.Build.0 = Debug|Any CPU - {12B130EB-1087-4F88-BDFA-3088868C0A46}.Release|Any CPU.ActiveCfg = Release|Any CPU - {12B130EB-1087-4F88-BDFA-3088868C0A46}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amazon.SellingPartnerAPIAA", "src\Amazon.SellingPartnerAPIAA\Amazon.SellingPartnerAPIAA.csproj", "{64339397-3AAB-49D3-8B50-7A467B16D545}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amazon.SellingPartnerAPIAATests", "test\Amazon.SellingPartnerAPIAATests\Amazon.SellingPartnerAPIAATests.csproj", "{12B130EB-1087-4F88-BDFA-3088868C0A46}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {64339397-3AAB-49D3-8B50-7A467B16D545}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {64339397-3AAB-49D3-8B50-7A467B16D545}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64339397-3AAB-49D3-8B50-7A467B16D545}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64339397-3AAB-49D3-8B50-7A467B16D545}.Release|Any CPU.Build.0 = Release|Any CPU + {12B130EB-1087-4F88-BDFA-3088868C0A46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {12B130EB-1087-4F88-BDFA-3088868C0A46}.Debug|Any CPU.Build.0 = Debug|Any CPU + {12B130EB-1087-4F88-BDFA-3088868C0A46}.Release|Any CPU.ActiveCfg = Release|Any CPU + {12B130EB-1087-4F88-BDFA-3088868C0A46}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/AWSAuthenticationCredentialsProvider.cs b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/AWSAuthenticationCredentialsProvider.cs new file mode 100644 index 00000000..bf93f6c9 --- /dev/null +++ b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/AWSAuthenticationCredentialsProvider.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Amazon.SellingPartnerAPIAA +{ + /** + * AWSAuthenticationCredentialsProvider + */ + public class AWSAuthenticationCredentialsProvider + { + /** + * AWS IAM Role ARN + */ + public String RoleArn { get; set; } + + /** + * AWS IAM Role Session Name + */ + public String RoleSessionName { get; set; } + } +} diff --git a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/AWSSigV4Signer.cs b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/AWSSigV4Signer.cs index 9f7e3db5..7bc5bf38 100644 --- a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/AWSSigV4Signer.cs +++ b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/AWSSigV4Signer.cs @@ -1,7 +1,11 @@ using System; using System.Text; using RestSharp; - +using Amazon.Runtime; +using Amazon.SecurityToken; +using Amazon.SecurityToken.Model; +using System.Threading; + namespace Amazon.SellingPartnerAPIAA { public class AWSSigV4Signer @@ -9,6 +13,9 @@ public class AWSSigV4Signer { public virtual AWSSignerHelper AwsSignerHelper { get; set; } private AWSAuthenticationCredentials awsCredentials; + private AssumeRoleResponse assumeRole; + public const string SecurityTokenHeaderName = "X-Amz-Security-Token"; + /// /// Constructor for AWSSigV4Signer @@ -17,6 +24,29 @@ public class AWSSigV4Signer public AWSSigV4Signer(AWSAuthenticationCredentials awsAuthenticationCredentials) { awsCredentials = awsAuthenticationCredentials; + AwsSignerHelper = new AWSSignerHelper(); + } + + + /// + /// Overloaded Constructor for AWSSigV4Signer using IAM Role + /// + /// AWS Developer Account Credentials + /// AWS IAM Role and Session Name container + public AWSSigV4Signer(AWSAuthenticationCredentials awsAuthenticationCredentials, + AWSAuthenticationCredentialsProvider awsAuthenticationCredentialsProvider) + { + awsCredentials = awsAuthenticationCredentials; + BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials( + awsAuthenticationCredentials.AccessKeyId, awsAuthenticationCredentials.SecretKey); + AmazonSecurityTokenServiceClient sts = new AmazonSecurityTokenServiceClient(basicAWSCredentials); + CancellationTokenSource source = new CancellationTokenSource(); + CancellationToken cancellationToken = source.Token; + assumeRole = sts.AssumeRoleAsync(new AssumeRoleRequest{ + RoleArn = awsAuthenticationCredentialsProvider.RoleArn, + RoleSessionName = awsAuthenticationCredentialsProvider.RoleSessionName + }).Result; + AwsSignerHelper = new AWSSignerHelper(); } @@ -28,7 +58,8 @@ public AWSSigV4Signer(AWSAuthenticationCredentials awsAuthenticationCredentials) /// RestRequest with AWS Signature public IRestRequest Sign(IRestRequest request, string host) { - DateTime signingDate = AwsSignerHelper.InitializeHeaders(request, host); + DateTime signingDate = AwsSignerHelper.SetDateAndHostHeaders(request, host); + string signedHeaders = AwsSignerHelper.ExtractSignedHeaders(request); string hashedCanonicalRequest = CreateCanonicalRequest(request, signedHeaders); @@ -37,19 +68,44 @@ public IRestRequest Sign(IRestRequest request, string host) hashedCanonicalRequest, awsCredentials.Region); - string signature = AwsSignerHelper.CalculateSignature(stringToSign, + if (assumeRole != null) + { + + Credentials credentials = assumeRole.Credentials; + AwsSignerHelper.SetSessionTokenHeader(request, credentials.SessionToken); + + string signature = AwsSignerHelper.CalculateSignature(stringToSign, signingDate, - awsCredentials.SecretKey, - awsCredentials.Region); - - AwsSignerHelper.AddSignature(request, - awsCredentials.AccessKeyId, + credentials.SecretAccessKey, + awsCredentials.Region); + AwsSignerHelper.AddSignature(request, + credentials.AccessKeyId, signedHeaders, signature, awsCredentials.Region, - signingDate); - - return request; + signingDate); + + return request; + } + else + { + + + + string signature = AwsSignerHelper.CalculateSignature(stringToSign, + signingDate, + awsCredentials.SecretKey, + awsCredentials.Region); + + AwsSignerHelper.AddSignature(request, + awsCredentials.AccessKeyId, + signedHeaders, + signature, + awsCredentials.Region, + signingDate); + + return request; + } } private string CreateCanonicalRequest(IRestRequest restRequest, string signedHeaders) diff --git a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/AWSSignerHelper.cs b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/AWSSignerHelper.cs index 5a2f7ef9..114a15fa 100644 --- a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/AWSSignerHelper.cs +++ b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/AWSSignerHelper.cs @@ -5,7 +5,8 @@ using RestSharp; using System.Text.RegularExpressions; using System.Globalization; - +using Amazon.SecurityToken.Model; + namespace Amazon.SellingPartnerAPIAA { public class AWSSignerHelper @@ -19,6 +20,7 @@ public class AWSSignerHelper public const string SignatureSubHeaderName = "Signature"; public const string SignedHeadersSubHeaderName = "SignedHeaders"; public const string HostHeaderName = "host"; + public const string SecurityTokenHeaderName = "X-Amz-Security-Token"; public const string Scheme = "AWS4"; public const string Algorithm = "HMAC-SHA256"; @@ -168,27 +170,41 @@ public virtual string BuildStringToSign(DateTime signingDate, string hashedCanon } /// - /// Sets AWS4 mandated 'x-amz-date' header, returning the date/time that will + /// Sets AWS4 mandated 'x-amz-date' and 'host' headers, returning the date/time that will /// be used throughout the signing process. /// /// RestRequest /// Request endpoint /// Date and time used for x-amz-date, in UTC - public virtual DateTime InitializeHeaders(IRestRequest restRequest, string host) + public virtual DateTime SetDateAndHostHeaders(IRestRequest restRequest, string host) { restRequest.Parameters.RemoveAll(parameter => ParameterType.HttpHeader.Equals(parameter.Type) && parameter.Name == XAmzDateHeaderName); restRequest.Parameters.RemoveAll(parameter => ParameterType.HttpHeader.Equals(parameter.Type) - && parameter.Name == HostHeaderName); - + && parameter.Name == HostHeaderName); + DateTime signingDate = DateHelper.GetUtcNow(); restRequest.AddHeader(XAmzDateHeaderName, signingDate.ToString(ISO8601BasicDateTimeFormat, CultureInfo.InvariantCulture)); - restRequest.AddHeader(HostHeaderName, host); - + restRequest.AddHeader(HostHeaderName, host); + return signingDate; } + /// + /// Sets AWS4 'X-Amz-Security-Token' header, used to pass the STS Token to + /// be used throughout the signing process. + /// + /// RestRequest + /// STS Session Token + public void SetSessionTokenHeader(IRestRequest restRequest, String sessionToken) + { + restRequest.Parameters.RemoveAll(parameter => ParameterType.HttpHeader.Equals(parameter.Type) + && parameter.Name == SecurityTokenHeaderName); + + restRequest.AddHeader(SecurityTokenHeaderName, sessionToken); + } + /// /// Calculates AWS4 signature for the string, prepared for signing /// diff --git a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/LWAAccessTokenRequestMeta.cs b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/LWAAccessTokenRequestMeta.cs index 1188272c..13da49f9 100644 --- a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/LWAAccessTokenRequestMeta.cs +++ b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/LWAAccessTokenRequestMeta.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using Newtonsoft.Json; namespace Amazon.SellingPartnerAPIAA diff --git a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/ApiClient.mustache b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/ApiClient.mustache index 3a98a346..27e0e9b1 100644 --- a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/ApiClient.mustache +++ b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/ApiClient.mustache @@ -70,7 +70,14 @@ namespace {{packageName}}.Client {{/netStandard}} lwaAuthorizationSigner = new LWAAuthorizationSigner(Configuration.AuthorizationCredentials); - awsSigV4Signer = new AWSSigV4Signer(Configuration.AuthenticationCredentials); + if (Configuration.AuthenticationCredentialsProvider!=null) + { + awsSigV4Signer = new AWSSigV4Signer(configuration.AuthenticationCredentials, Configuration.AuthenticationCredentialsProvider); + } + else + { + awsSigV4Signer = new AWSSigV4Signer(Configuration.AuthenticationCredentials); + } } /// diff --git a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/Configuration.mustache b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/Configuration.mustache index 77b0154b..b00877b1 100644 --- a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/Configuration.mustache +++ b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/Configuration.mustache @@ -275,6 +275,12 @@ namespace {{packageName}}.Client /// The AWSAuthenticationCredentials public virtual AWSAuthenticationCredentials AuthenticationCredentials { get; set; } + /// + /// Gets or sets the AWSAuthenticationCredentialsProvider for Amazon Selling Partner API Authentication + /// + /// The AWSAuthenticationCredentialsProvider + public virtual AWSAuthenticationCredentialsProvider AuthenticationCredentialsProvider { get; set; } + /// /// Gets the API key with prefix. /// diff --git a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/IReadableConfiguration.mustache b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/IReadableConfiguration.mustache index 525e9cee..a280b34c 100644 --- a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/IReadableConfiguration.mustache +++ b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/IReadableConfiguration.mustache @@ -94,5 +94,11 @@ namespace {{packageName}}.Client /// /// AuthenticationCredentials AWSAuthenticationCredentials AuthenticationCredentials { get; } + + /// + /// Gets the AWSAuthenticationCredentialsProvider for Amazon Selling Partner API Authentication + /// + /// AWSAuthenticationCredentialsProvider + AWSAuthenticationCredentialsProvider AuthenticationCredentialsProvider { get; } } } diff --git a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/api.mustache b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/api.mustache index a9b1bcc3..dfe3ecbc 100644 --- a/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/api.mustache +++ b/clients/sellingpartner-api-aa-csharp/src/Amazon.SellingPartnerAPIAA/resources/swagger-codegen/templates/api.mustache @@ -436,6 +436,7 @@ namespace {{packageName}}.{{apiPackage}} { private LWAAuthorizationCredentials lwaAuthorizationCredentials; private AWSAuthenticationCredentials awsAuthenticationCredentials; + private AWSAuthenticationCredentialsProvider awsAuthenticationCredentialsProvider; public Builder SetLWAAuthorizationCredentials(LWAAuthorizationCredentials lwaAuthorizationCredentials) { @@ -449,6 +450,12 @@ namespace {{packageName}}.{{apiPackage}} return this; } + public Builder SetAWSAuthenticationCredentialsProvider(AWSAuthenticationCredentialsProvider awsAuthenticationCredentialsProvider) + { + this.awsAuthenticationCredentialsProvider = awsAuthenticationCredentialsProvider; + return this; + } + public {{classname}} Build() { if (lwaAuthorizationCredentials == null) @@ -463,6 +470,10 @@ namespace {{packageName}}.{{apiPackage}} {{packageName}}.Client.Configuration configuration = new {{packageName}}.Client.Configuration() { + if (awsAuthenticationCredentialsProvider != null) + { + AuthenticationCredentialsProvider = awsAuthenticationCredentialsProvider, + } AuthorizationCredentials = lwaAuthorizationCredentials, AuthenticationCredentials = awsAuthenticationCredentials }; diff --git a/clients/sellingpartner-api-aa-csharp/test/Amazon.SellingPartnerAPIAATests/AWSSigV4SignerTest.cs b/clients/sellingpartner-api-aa-csharp/test/Amazon.SellingPartnerAPIAATests/AWSSigV4SignerTest.cs index d0487a0a..c9b24807 100644 --- a/clients/sellingpartner-api-aa-csharp/test/Amazon.SellingPartnerAPIAATests/AWSSigV4SignerTest.cs +++ b/clients/sellingpartner-api-aa-csharp/test/Amazon.SellingPartnerAPIAATests/AWSSigV4SignerTest.cs @@ -41,7 +41,7 @@ public void TestSignRequest() string expectedSignedHeaders = "testSignedHeaders"; string expectedSignature = "testSignature"; string expectedStringToSign = "testStringToSign"; - mockAWSSignerHelper.Setup(signerHelper => signerHelper.InitializeHeaders(request, TestHost)) + mockAWSSignerHelper.Setup(signerHelper => signerHelper.SetDateAndHostHeaders(request, TestHost)) .Returns(signingDate); mockAWSSignerHelper.Setup(signerHelper => signerHelper.ExtractCanonicalURIParameters(request.Resource)) .Returns("testURIParameters"); @@ -62,7 +62,7 @@ public void TestSignRequest() IRestRequest actualRestRequest = sigV4SignerUnderTest.Sign(request, TestHost); - mockAWSSignerHelper.Verify(signerHelper => signerHelper.InitializeHeaders(request, TestHost)); + mockAWSSignerHelper.Verify(signerHelper => signerHelper.SetDateAndHostHeaders(request, TestHost)); mockAWSSignerHelper.Verify(signerHelper => signerHelper.ExtractCanonicalURIParameters(request.Resource)); mockAWSSignerHelper.Verify(signerHelper => signerHelper.ExtractCanonicalQueryString(request)); mockAWSSignerHelper.Verify(signerHelper => signerHelper.ExtractCanonicalHeaders(request)); diff --git a/clients/sellingpartner-api-aa-csharp/test/Amazon.SellingPartnerAPIAATests/AWSSignerHelperTest.cs b/clients/sellingpartner-api-aa-csharp/test/Amazon.SellingPartnerAPIAATests/AWSSignerHelperTest.cs index 4a10c8c8..2b6c5369 100644 --- a/clients/sellingpartner-api-aa-csharp/test/Amazon.SellingPartnerAPIAATests/AWSSignerHelperTest.cs +++ b/clients/sellingpartner-api-aa-csharp/test/Amazon.SellingPartnerAPIAATests/AWSSignerHelperTest.cs @@ -4,6 +4,9 @@ using Amazon.SellingPartnerAPIAA; using System.Text; using Moq; +using Amazon.SecurityToken.Model; +using Amazon.Runtime; +using Amazon.SecurityToken; namespace Amazon.SellingPartnerAPIAATests { @@ -18,6 +21,7 @@ public class AWSSignerHelperTest private const string TestResourcePath = "iam/user"; private const string TestHost = "sellingpartnerapi.amazon.com"; private const string JsonMediaType = "application/json; charset=utf-8"; + private const string TestSessionToken = "sToken"; private static readonly DateTime SigningDate = DateTime.Parse("2020-05-04 12:12:12"); @@ -156,8 +160,8 @@ public void TestBuildStringToSign() { string expectedCanonicalHash = "foo"; StringBuilder expectedStringBuilder = new StringBuilder(); - expectedStringBuilder.AppendLine("AWS4-HMAC-SHA256"); - expectedStringBuilder.AppendLine(ISOSigningDateTime); + expectedStringBuilder.Append("AWS4-HMAC-SHA256" + "\n"); + expectedStringBuilder.Append(ISOSigningDateTime + "\n"); expectedStringBuilder.AppendFormat("{0}/{1}/execute-api/aws4_request\n", ISOSigningDate, TestRegion); expectedStringBuilder.Append(expectedCanonicalHash); @@ -169,14 +173,14 @@ public void TestBuildStringToSign() [Fact] public void TestInitializeHeadersReturnsUtcNow() { - Assert.Equal(SigningDate, awsSignerHelperUnderTest.InitializeHeaders(new RestRequest(), TestHost)); + Assert.Equal(SigningDate, awsSignerHelperUnderTest.SetDateAndHostHeaders(new RestRequest(), TestHost)); } [Fact] public void TestInitializeHeadersSetsUtcNowXAmzDateHeader() { IRestRequest request = new RestRequest(); - awsSignerHelperUnderTest.InitializeHeaders(request, TestHost); + awsSignerHelperUnderTest.SetDateAndHostHeaders(request, TestHost); Parameter actualParameter = request.Parameters.Find(parameter => ParameterType.HttpHeader.Equals(parameter.Type) && parameter.Name == AWSSignerHelper.XAmzDateHeaderName); @@ -190,7 +194,7 @@ public void TestInitializeHeadersOverwritesXAmzDateHeader() IRestRequest request = new RestRequest(); request.AddHeader(AWSSignerHelper.XAmzDateHeaderName, "foobar"); - awsSignerHelperUnderTest.InitializeHeaders(request, TestHost); + awsSignerHelperUnderTest.SetDateAndHostHeaders(request, TestHost); Parameter actualParameter = request.Parameters.Find(parameter => ParameterType.HttpHeader.Equals(parameter.Type) && parameter.Name == AWSSignerHelper.XAmzDateHeaderName); @@ -243,7 +247,7 @@ public void TestInitializeHeadersSetsHostHeader() { IRestRequest restRequest = new RestRequest(); - awsSignerHelperUnderTest.InitializeHeaders(restRequest, TestHost); + awsSignerHelperUnderTest.SetDateAndHostHeaders(restRequest, TestHost); Parameter actualParamter = restRequest.Parameters.Find(parameter => ParameterType.HttpHeader.Equals(parameter.Type) && parameter.Name == AWSSignerHelper.HostHeaderName); @@ -258,12 +262,27 @@ public void TestInitializeHeadersOverwritesHostHeader() restRequest.AddHeader(AWSSignerHelper.HostHeaderName, "foobar"); - awsSignerHelperUnderTest.InitializeHeaders(restRequest, TestHost); + awsSignerHelperUnderTest.SetDateAndHostHeaders(restRequest, TestHost); Parameter actualParamter = restRequest.Parameters.Find(parameter => ParameterType.HttpHeader.Equals(parameter.Type) && parameter.Name == AWSSignerHelper.HostHeaderName); Assert.Equal(TestHost, actualParamter.Value); } + + [Fact] + public void TestSetSessionHeader() + { + IRestRequest restRequest = new RestRequest(); + + restRequest.AddHeader(AWSSignerHelper.SecurityTokenHeaderName, "testName"); + + awsSignerHelperUnderTest.SetSessionTokenHeader(restRequest, TestSessionToken); + + Parameter actualParameter = restRequest.Parameters.Find(parameter => + ParameterType.HttpHeader.Equals(parameter.Type) && parameter.Name == AWSSignerHelper.SecurityTokenHeaderName); + + Assert.Equal(TestSessionToken, actualParameter.Value); + } } }