AWS SDK for C++

AWS SDK for C++ Version 1.11.606

Loading...
Searching...
No Matches
SigV4Signer.h
1
5#pragma once
6
7#include <smithy/identity/signer/AwsSignerBase.h>
8#include <smithy/identity/identity/AwsCredentialIdentityBase.h>
9
10#include <aws/core/auth/signer/AWSAuthV4Signer.h>
11
12#include <aws/core/auth/AWSCredentials.h>
13#include <smithy/identity/signer/built-in/SignerProperties.h>
14#include <smithy/identity/auth/AuthSchemeResolverBase.h>
15
16namespace smithy {
21 class AwsSigV4Signer : public AwsSignerBase<AwsCredentialIdentityBase> {
22
23 public:
25 explicit AwsSigV4Signer(const Aws::String& serviceName, const Aws::String& region)
26 : m_serviceName(serviceName),
27 m_region(region),
28 legacySigner(nullptr, serviceName.c_str(), region, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Always)
29 {
30 }
31 /*
32 For legacy constructors, this is needed
33 */
34 explicit AwsSigV4Signer(const Aws::String& serviceName, const Aws::String& region, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy policy, bool urlEscapePath)
35 : m_serviceName(serviceName),
36 m_region(region),
37 legacySigner(nullptr, serviceName.c_str(), region, policy, urlEscapePath)
38 {
39 }
40
41 SigningFutureOutcome sign(std::shared_ptr<HttpRequest> httpRequest, const AwsCredentialIdentityBase& identity, SigningProperties properties) override
42 {
43 const auto legacyCreds = [&identity]() -> Aws::Auth::AWSCredentials {
44 if(identity.sessionToken().has_value() && identity.expiration().has_value())
45 {
46 return {identity.accessKeyId(), identity.secretAccessKey(), *identity.sessionToken(), *identity.expiration()};
47 }
48 if(identity.sessionToken().has_value())
49 {
50 return {identity.accessKeyId(), identity.secretAccessKey(), *identity.sessionToken()};
51 }
52 return {identity.accessKeyId(), identity.secretAccessKey()};
53 }();
54
55 auto signPayloadIt = properties.find("SignPayload");
56 bool signPayload = signPayloadIt != properties.end() ? signPayloadIt->second.get<Aws::String>() == "true" : false;
57
58 auto signerRegionOverrideIt = properties.find(smithy::SIGNER_REGION_PROPERTY);
59 auto region = signerRegionOverrideIt != properties.end() ? signerRegionOverrideIt->second.get<Aws::String>().c_str() : m_region.c_str();
60
61 auto signerServiceNameOverrideIt = properties.find(smithy::SIGNER_SERVICE_NAME);
62 auto svcName = signerServiceNameOverrideIt != properties.end() ? signerServiceNameOverrideIt->second.get<Aws::String>().c_str() : m_serviceName.c_str();
63
64
65 assert(httpRequest);
66 bool success = legacySigner.SignRequestWithCreds(*httpRequest, legacyCreds, region, svcName, signPayload);
67 if (success)
68 {
69 return SigningFutureOutcome(std::move(httpRequest));
70 }
71 return SigningError(Aws::Client::CoreErrors::MEMORY_ALLOCATION, "", "Failed to sign the request with sigv4", false);
72 }
73
74 SigningFutureOutcome presign(std::shared_ptr<HttpRequest> httpRequest, const AwsCredentialIdentityBase& identity, SigningProperties properties, const Aws::String& region, const Aws::String& serviceName, long long expirationTimeInSeconds) override
75 {
76 AWS_UNREFERENCED_PARAM(properties);
77 const auto legacyCreds = [&identity]() -> Aws::Auth::AWSCredentials {
78 if(identity.sessionToken().has_value() && identity.expiration().has_value())
79 {
80 return {identity.accessKeyId(), identity.secretAccessKey(), *identity.sessionToken(), *identity.expiration()};
81 }
82 if(identity.sessionToken().has_value())
83 {
84 return {identity.accessKeyId(), identity.secretAccessKey(), *identity.sessionToken()};
85 }
86 return {identity.accessKeyId(), identity.secretAccessKey()};
87 }();
88 auto result = legacySigner.PresignRequest(*httpRequest, legacyCreds, region.empty() ? nullptr : region.c_str(), serviceName.empty() ? nullptr : serviceName.c_str(), expirationTimeInSeconds);
89
90 return (result ? SigningFutureOutcome(std::move(httpRequest)) :
92 false /*retryable*/));
93 }
94
95 virtual ~AwsSigV4Signer() {};
96 protected:
97
98 // strictly for backward compatibility
99 explicit AwsSigV4Signer(const std::shared_ptr<Aws::Auth::AWSCredentialsProvider> &credentialsProvider, const Aws::String& serviceName, const Aws::String& region, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy policy,
100 bool urlEscapePath, Aws::Auth::AWSSigningAlgorithm signingAlgorithm )
101 : m_serviceName(serviceName),
102 m_region(region),
103 legacySigner(credentialsProvider, serviceName.c_str(), region, policy, urlEscapePath, signingAlgorithm)
104 {
105 }
106
108 return legacySigner;
109 }
110
114 };
115}
bool PresignRequest(Aws::Http::HttpRequest &request, long long expirationInSeconds=0) const override
virtual Aws::String accessKeyId() const =0
virtual Aws::Crt::Optional< AwsIdentity::DateTime > expiration() const override=0
virtual Aws::String secretAccessKey() const =0
virtual Aws::Crt::Optional< Aws::String > sessionToken() const =0
Aws::String m_serviceName
SigningFutureOutcome presign(std::shared_ptr< HttpRequest > httpRequest, const AwsCredentialIdentityBase &identity, SigningProperties properties, const Aws::String &region, const Aws::String &serviceName, long long expirationTimeInSeconds) override
Definition SigV4Signer.h:74
Aws::Client::AWSAuthV4Signer legacySigner
const Aws::Client::AWSAuthV4Signer & getLegacySigner() const
SigningFutureOutcome sign(std::shared_ptr< HttpRequest > httpRequest, const AwsCredentialIdentityBase &identity, SigningProperties properties) override
Definition SigV4Signer.h:41
AwsSigV4Signer(const Aws::String &serviceName, const Aws::String &region)
Definition SigV4Signer.h:25
AwsSigV4Signer(const std::shared_ptr< Aws::Auth::AWSCredentialsProvider > &credentialsProvider, const Aws::String &serviceName, const Aws::String &region, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy policy, bool urlEscapePath, Aws::Auth::AWSSigningAlgorithm signingAlgorithm)
Definition SigV4Signer.h:99
AwsSigV4Signer(const Aws::String &serviceName, const Aws::String &region, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy policy, bool urlEscapePath)
Definition SigV4Signer.h:34
Aws::Client::AWSError< Aws::Client::CoreErrors > SigningError
Aws::Utils::FutureOutcome< std::shared_ptr< HttpRequest >, SigningError > SigningFutureOutcome
Aws::UnorderedMap< Aws::String, Aws::Crt::Variant< Aws::String, bool > > SigningProperties
std::basic_string< char, std::char_traits< char >, Aws::Allocator< char > > String
Definition AWSString.h:97
SMITHY_API const char * SIGNER_REGION_PROPERTY
SMITHY_API const char * SIGNER_SERVICE_NAME