Lesson 35 - Get Compute Auth Token Working
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
/**
|
||||
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <aws/core/auth/bearer-token-provider/AWSBearerTokenProviderBase.h>
|
||||
#include <aws/core/auth/bearer-token-provider/SSOBearerTokenProvider.h>
|
||||
#include <smithy/identity/identity/AwsBearerTokenIdentity.h>
|
||||
#include <smithy/identity/resolver/AwsIdentityResolverBase.h>
|
||||
|
||||
namespace smithy
|
||||
{
|
||||
|
||||
class AwsBearerTokenIdentityResolver
|
||||
: public IdentityResolverBase<AwsBearerTokenIdentityBase>
|
||||
{
|
||||
public:
|
||||
static const char BEARER_TOKEN_PROVIDER_CHAIN_LOG_TAG[];
|
||||
|
||||
using IdentityT = AwsBearerTokenIdentity;
|
||||
virtual ~AwsBearerTokenIdentityResolver() = default;
|
||||
|
||||
AwsBearerTokenIdentityResolver() = default;
|
||||
|
||||
AwsBearerTokenIdentityResolver(
|
||||
const Aws::Vector<
|
||||
std::shared_ptr<Aws::Auth::AWSBearerTokenProviderBase>>
|
||||
&providerChain)
|
||||
: m_providerChainLegacy{providerChain}
|
||||
{
|
||||
}
|
||||
|
||||
ResolveIdentityFutureOutcome
|
||||
getIdentity(const IdentityProperties &identityProperties,
|
||||
const AdditionalParameters &additionalParameters) override
|
||||
{
|
||||
AWS_UNREFERENCED_PARAM(identityProperties);
|
||||
AWS_UNREFERENCED_PARAM(additionalParameters);
|
||||
for (auto &bearerTokenProvider : m_providerChainLegacy)
|
||||
{
|
||||
if (!bearerTokenProvider)
|
||||
{
|
||||
AWS_LOGSTREAM_FATAL(
|
||||
BEARER_TOKEN_PROVIDER_CHAIN_LOG_TAG,
|
||||
"Unexpected nullptr in "
|
||||
"DefaultBearerTokenProviderChain::m_providerChain");
|
||||
return Aws::Client::AWSError<Aws::Client::CoreErrors>(
|
||||
Aws::Client::CoreErrors::INVALID_PARAMETER_VALUE, "",
|
||||
"Unexpected nullptr in "
|
||||
"BearerTokenProviderChain::m_providerChain",
|
||||
false);
|
||||
}
|
||||
auto bearerToken = bearerTokenProvider->GetAWSBearerToken();
|
||||
if (!bearerToken.IsExpiredOrEmpty())
|
||||
{
|
||||
auto outcomePtr = Aws::MakeUnique<AwsBearerTokenIdentity>(
|
||||
BEARER_TOKEN_PROVIDER_CHAIN_LOG_TAG);
|
||||
outcomePtr->token() = bearerToken.GetToken();
|
||||
outcomePtr->expiration() = bearerToken.GetExpiration();
|
||||
return ResolveIdentityFutureOutcome(std::move(outcomePtr));
|
||||
}
|
||||
}
|
||||
|
||||
return Aws::Client::AWSError<Aws::Client::CoreErrors>(
|
||||
Aws::Client::CoreErrors::NOT_INITIALIZED, "",
|
||||
"No bearer token provider in chain found", false);
|
||||
}
|
||||
|
||||
void AddBearerTokenProvider(
|
||||
std::shared_ptr<Aws::Auth::AWSBearerTokenProviderBase> provider)
|
||||
{
|
||||
m_providerChainLegacy.emplace_back(std::move(provider));
|
||||
}
|
||||
|
||||
protected:
|
||||
Aws::Vector<std::shared_ptr<Aws::Auth::AWSBearerTokenProviderBase>>
|
||||
m_providerChainLegacy;
|
||||
};
|
||||
|
||||
class DefaultAwsBearerTokenIdentityResolver
|
||||
: public AwsBearerTokenIdentityResolver
|
||||
{
|
||||
public:
|
||||
using IdentityT = AwsBearerTokenIdentity;
|
||||
virtual ~DefaultAwsBearerTokenIdentityResolver() = default;
|
||||
|
||||
DefaultAwsBearerTokenIdentityResolver()
|
||||
: AwsBearerTokenIdentityResolver(
|
||||
{Aws::MakeShared<Aws::Auth::SSOBearerTokenProvider>(
|
||||
"SSOBearerTokenProvider")}){};
|
||||
};
|
||||
const char
|
||||
AwsBearerTokenIdentityResolver::BEARER_TOKEN_PROVIDER_CHAIN_LOG_TAG[] =
|
||||
"BearerTokenProvider";
|
||||
|
||||
} // namespace smithy
|
||||
@@ -0,0 +1,19 @@
|
||||
/**
|
||||
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <smithy/identity/resolver/AwsIdentityResolverBase.h>
|
||||
|
||||
#include <smithy/identity/identity/AwsCredentialIdentity.h>
|
||||
|
||||
namespace smithy {
|
||||
class AwsCredentialIdentityResolver : public IdentityResolverBase<AwsCredentialIdentityBase> {
|
||||
public:
|
||||
using IdentityT = AwsCredentialIdentity;
|
||||
virtual ~AwsCredentialIdentityResolver() = default;
|
||||
|
||||
ResolveIdentityFutureOutcome getIdentity(const IdentityProperties& identityProperties, const AdditionalParameters& additionalParameters) override = 0;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <aws/crt/Optional.h>
|
||||
#include <aws/crt/Variant.h>
|
||||
|
||||
#include <aws/core/client/CoreErrors.h>
|
||||
#include <aws/core/utils/FutureOutcome.h>
|
||||
|
||||
#include <aws/core/utils/memory/stl/AWSString.h>
|
||||
#include <aws/core/utils/memory/stl/AWSMap.h>
|
||||
|
||||
#include <aws/core/utils/DateTime.h>
|
||||
|
||||
namespace smithy {
|
||||
template<typename IDENTITY_T>
|
||||
class IdentityResolverBase {
|
||||
public:
|
||||
using IdentityT = IDENTITY_T;
|
||||
|
||||
virtual ~IdentityResolverBase(){};
|
||||
|
||||
using IdentityProperties = Aws::UnorderedMap<Aws::String, Aws::Crt::Variant<Aws::String, bool>>;
|
||||
// IdentityResolvers are asynchronous.
|
||||
using ResolveIdentityFutureOutcome = Aws::Utils::FutureOutcome<Aws::UniquePtr<IdentityT>, Aws::Client::AWSError<Aws::Client::CoreErrors>>;
|
||||
using AdditionalParameters = Aws::UnorderedMap<Aws::String, Aws::Crt::Variant<Aws::String, bool>>;
|
||||
|
||||
// Each Identity has one or more identity resolvers that are able to load the customer’s
|
||||
// Identity. An identity resolver might load the identity from a remote service (e.g. STS), a local
|
||||
// service (e.g. IMDS), local disk (e.g. a configuration file) or local memory (e.g. environment variables).
|
||||
virtual ResolveIdentityFutureOutcome getIdentity(const IdentityProperties& identityProperties, const AdditionalParameters& additionalParameters) = 0;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
/**
|
||||
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <smithy/identity/resolver/AwsCredentialIdentityResolver.h>
|
||||
|
||||
#include <aws/core/auth/AWSCredentials.h>
|
||||
#include <aws/core/auth/AWSCredentialsProviderChain.h>
|
||||
|
||||
namespace smithy
|
||||
{
|
||||
class AwsCredentialsProviderIdentityResolver : public AwsCredentialIdentityResolver
|
||||
{
|
||||
public:
|
||||
using SigV4AuthSchemeParameters = DefaultAuthSchemeResolverParameters;
|
||||
|
||||
explicit AwsCredentialsProviderIdentityResolver(const std::shared_ptr<Aws::Auth::AWSCredentialsProvider> credentialsProvider)
|
||||
: m_credentialsProvider(credentialsProvider)
|
||||
{
|
||||
}
|
||||
|
||||
AwsCredentialsProviderIdentityResolver(const AwsCredentialsProviderIdentityResolver& other) = delete;
|
||||
AwsCredentialsProviderIdentityResolver(AwsCredentialsProviderIdentityResolver&& other) noexcept = default;
|
||||
AwsCredentialsProviderIdentityResolver& operator=(const AwsCredentialsProviderIdentityResolver& other) = delete;
|
||||
AwsCredentialsProviderIdentityResolver& operator=(AwsCredentialsProviderIdentityResolver&& other) noexcept = default;
|
||||
~AwsCredentialsProviderIdentityResolver() override = default;
|
||||
|
||||
ResolveIdentityFutureOutcome getIdentity(const IdentityProperties& identityProperties,
|
||||
const AdditionalParameters& additionalParameters) override
|
||||
{
|
||||
AWS_UNREFERENCED_PARAM(identityProperties);
|
||||
AWS_UNREFERENCED_PARAM(additionalParameters);
|
||||
|
||||
const auto fetchedCreds = m_credentialsProvider->GetAWSCredentials();
|
||||
|
||||
auto smithyCreds = Aws::MakeUnique<AwsCredentialIdentity>("DefaultAwsCredentialIdentityResolver",
|
||||
fetchedCreds.GetAWSAccessKeyId(), fetchedCreds.GetAWSSecretKey(),
|
||||
fetchedCreds.GetSessionToken(), fetchedCreds.GetExpiration());
|
||||
|
||||
return {std::move(smithyCreds)};
|
||||
}
|
||||
|
||||
protected:
|
||||
std::shared_ptr<Aws::Auth::AWSCredentialsProvider> m_credentialsProvider;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <smithy/identity/resolver/AwsCredentialIdentityResolver.h>
|
||||
|
||||
#include <aws/core/auth/AWSCredentials.h>
|
||||
#include <aws/core/auth/AWSCredentialsProviderChain.h>
|
||||
|
||||
namespace smithy {
|
||||
constexpr char ALLOC_ID[] = "DefaultAwsCredentialIdentityResolver";
|
||||
/**
|
||||
* A smithy SigV4 AWS Credentials resolver wrapper on top of legacy SDK Credentials provider
|
||||
* TODO: refactor into own signer using smithy design
|
||||
*/
|
||||
class DefaultAwsCredentialIdentityResolver : public AwsCredentialIdentityResolver {
|
||||
protected:
|
||||
|
||||
mutable std::shared_ptr<Aws::Auth::AWSCredentialsProviderChain> legacyChain_sp;
|
||||
|
||||
public:
|
||||
using SigV4AuthSchemeParameters = DefaultAuthSchemeResolverParameters;
|
||||
|
||||
DefaultAwsCredentialIdentityResolver(): legacyChain_sp{Aws::MakeShared<Aws::Auth::DefaultAWSCredentialsProviderChain>(ALLOC_ID)}{
|
||||
|
||||
};
|
||||
|
||||
DefaultAwsCredentialIdentityResolver(const DefaultAwsCredentialIdentityResolver& other) = delete;
|
||||
DefaultAwsCredentialIdentityResolver(DefaultAwsCredentialIdentityResolver&& other) noexcept = default;
|
||||
DefaultAwsCredentialIdentityResolver& operator=(const DefaultAwsCredentialIdentityResolver& other) = delete;
|
||||
DefaultAwsCredentialIdentityResolver& operator=(DefaultAwsCredentialIdentityResolver&& other) noexcept = default;
|
||||
virtual ~DefaultAwsCredentialIdentityResolver() = default;
|
||||
|
||||
DefaultAwsCredentialIdentityResolver(std::shared_ptr<Aws::Auth::AWSCredentialsProviderChain> providerChain): legacyChain_sp{providerChain}
|
||||
{
|
||||
assert(legacyChain_sp);
|
||||
};
|
||||
|
||||
ResolveIdentityFutureOutcome getIdentity(const IdentityProperties& identityProperties, const AdditionalParameters& additionalParameters) override
|
||||
{
|
||||
AWS_UNREFERENCED_PARAM(identityProperties);
|
||||
AWS_UNREFERENCED_PARAM(additionalParameters);
|
||||
|
||||
auto legacyCreds = legacyChain_sp->GetAWSCredentials();
|
||||
|
||||
auto smithyCreds = Aws::MakeUnique<AwsCredentialIdentity>("DefaultAwsCredentialIdentityResolver",
|
||||
legacyCreds.GetAWSAccessKeyId(),
|
||||
legacyCreds.GetAWSSecretKey(),
|
||||
legacyCreds.GetSessionToken().empty()? Aws::Crt::Optional<Aws::String>() : legacyCreds.GetSessionToken(),
|
||||
legacyCreds.GetExpiration());
|
||||
|
||||
return ResolveIdentityFutureOutcome(std::move(smithyCreds));
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <smithy/identity/resolver/AwsCredentialIdentityResolver.h>
|
||||
|
||||
#include <aws/core/auth/AWSCredentials.h>
|
||||
#include <aws/core/auth/AWSCredentialsProviderChain.h>
|
||||
|
||||
namespace smithy
|
||||
{
|
||||
class SimpleAwsCredentialIdentityResolver : public AwsCredentialIdentityResolver
|
||||
{
|
||||
public:
|
||||
using SigV4AuthSchemeParameters = DefaultAuthSchemeResolverParameters;
|
||||
|
||||
explicit SimpleAwsCredentialIdentityResolver(const Aws::Auth::AWSCredentials& credentials)
|
||||
: m_credentials(credentials)
|
||||
{
|
||||
}
|
||||
|
||||
SimpleAwsCredentialIdentityResolver(const SimpleAwsCredentialIdentityResolver& other) = delete;
|
||||
SimpleAwsCredentialIdentityResolver(SimpleAwsCredentialIdentityResolver&& other) noexcept = default;
|
||||
SimpleAwsCredentialIdentityResolver& operator=(const SimpleAwsCredentialIdentityResolver& other) = delete;
|
||||
SimpleAwsCredentialIdentityResolver& operator=(SimpleAwsCredentialIdentityResolver&& other) noexcept = default;
|
||||
virtual ~SimpleAwsCredentialIdentityResolver() = default;
|
||||
|
||||
ResolveIdentityFutureOutcome getIdentity(const IdentityProperties& identityProperties,
|
||||
const AdditionalParameters& additionalParameters) override
|
||||
{
|
||||
AWS_UNREFERENCED_PARAM(identityProperties);
|
||||
AWS_UNREFERENCED_PARAM(additionalParameters);
|
||||
|
||||
auto smithyCreds = Aws::MakeUnique<AwsCredentialIdentity>("DefaultAwsCredentialIdentityResolver",
|
||||
m_credentials.GetAWSAccessKeyId(), m_credentials.GetAWSSecretKey(),
|
||||
m_credentials.GetSessionToken(), m_credentials.GetExpiration());
|
||||
|
||||
return {std::move(smithyCreds)};
|
||||
}
|
||||
|
||||
protected:
|
||||
Aws::Auth::AWSCredentials m_credentials;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user