Skip to content

Commit 20394ed

Browse files
jdisantiZelda Hessler
authored andcommitted
Add HTTP basic and bearer auth support to the orchestrator (#2622)
## Motivation and Context This PR adds support for Smithy's `@httpBasicAuth` and `@httpBearerAuth` auth schemes, and ports the `@httpApiKeyAuth` scheme to the orchestrator. This is prerequisite work for supporting Amazon CodeCatalyst since that requires bearer auth. This PR also fixes a bug in auth orchestrator that caused an error if no identity is present for a scheme even when an identity for a lower priority scheme is available. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Zelda Hessler <zhessler@amazon.com>
1 parent 27498a7 commit 20394ed

File tree

43 files changed

+1960
-339
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1960
-339
lines changed

aws/rust-runtime/aws-runtime/src/auth.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@ pub mod sigv4 {
1212
UriPathNormalizationMode,
1313
};
1414
use aws_smithy_http::property_bag::PropertyBag;
15-
use aws_smithy_runtime_api::client::identity::Identity;
15+
use aws_smithy_runtime_api::client::identity::{Identity, IdentityResolver, IdentityResolvers};
1616
use aws_smithy_runtime_api::client::orchestrator::{
17-
BoxError, HttpAuthScheme, HttpRequest, HttpRequestSigner, IdentityResolver,
18-
IdentityResolvers,
17+
BoxError, HttpAuthScheme, HttpRequest, HttpRequestSigner,
1918
};
2019
use aws_types::region::SigningRegion;
2120
use aws_types::SigningService;

aws/rust-runtime/aws-runtime/src/identity.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@
77
pub mod credentials {
88
use aws_credential_types::cache::SharedCredentialsCache;
99
use aws_smithy_http::property_bag::PropertyBag;
10-
use aws_smithy_runtime_api::client::identity::Identity;
11-
use aws_smithy_runtime_api::client::orchestrator::{
12-
BoxError, BoxFallibleFut, IdentityResolver,
13-
};
10+
use aws_smithy_runtime_api::client::identity::{Identity, IdentityResolver};
11+
use aws_smithy_runtime_api::client::orchestrator::{BoxError, Future};
1412

1513
/// Smithy identity resolver for AWS credentials.
1614
#[derive(Debug)]
@@ -26,13 +24,13 @@ pub mod credentials {
2624
}
2725

2826
impl IdentityResolver for CredentialsIdentityResolver {
29-
fn resolve_identity(&self, _identity_properties: &PropertyBag) -> BoxFallibleFut<Identity> {
27+
fn resolve_identity(&self, _identity_properties: &PropertyBag) -> Future<Identity> {
3028
let cache = self.credentials_cache.clone();
31-
Box::pin(async move {
29+
Future::new(Box::pin(async move {
3230
let credentials = cache.as_ref().provide_cached_credentials().await?;
3331
let expiration = credentials.expiry();
3432
Result::<_, BoxError>::Ok(Identity::new(credentials, expiration))
35-
})
33+
}))
3634
}
3735
}
3836
}

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package software.amazon.smithy.rustsdk
77

8-
import software.amazon.smithy.codegen.core.Symbol
98
import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
109
import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule
1110
import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator
@@ -14,6 +13,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.client.Fluen
1413
import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerator
1514
import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerics
1615
import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientSection
16+
import software.amazon.smithy.rust.codegen.client.smithy.generators.client.NoClientGenerics
1717
import software.amazon.smithy.rust.codegen.core.rustlang.Attribute
1818
import software.amazon.smithy.rust.codegen.core.rustlang.Feature
1919
import software.amazon.smithy.rust.codegen.core.rustlang.GenericTypeArg
@@ -50,37 +50,6 @@ private class Types(runtimeConfig: RuntimeConfig) {
5050
val timeoutConfig = smithyTypes.resolve("timeout::TimeoutConfig")
5151
}
5252

53-
private class AwsClientGenerics(private val types: Types) : FluentClientGenerics {
54-
/** Declaration with defaults set */
55-
override val decl = writable { }
56-
57-
/** Instantiation of the Smithy client generics */
58-
override val smithyInst = writable {
59-
rustTemplate(
60-
"<#{DynConnector}, #{DynMiddleware}<#{DynConnector}>>",
61-
"DynConnector" to types.dynConnector,
62-
"DynMiddleware" to types.dynMiddleware,
63-
)
64-
}
65-
66-
/** Instantiation */
67-
override val inst = ""
68-
69-
/** Trait bounds */
70-
override val bounds = writable { }
71-
72-
/** Bounds for generated `send()` functions */
73-
override fun sendBounds(
74-
operation: Symbol,
75-
operationOutput: Symbol,
76-
operationError: Symbol,
77-
retryClassifier: RuntimeType,
78-
): Writable =
79-
writable { }
80-
81-
override fun toRustGenerics() = RustGenerics()
82-
}
83-
8453
class AwsFluentClientDecorator : ClientCodegenDecorator {
8554
override val name: String = "FluentClient"
8655

@@ -90,7 +59,7 @@ class AwsFluentClientDecorator : ClientCodegenDecorator {
9059
override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) {
9160
val runtimeConfig = codegenContext.runtimeConfig
9261
val types = Types(runtimeConfig)
93-
val generics = AwsClientGenerics(types)
62+
val generics = NoClientGenerics(runtimeConfig)
9463
FluentClientGenerator(
9564
codegenContext,
9665
reexportSmithyClientBuilder = false,

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,18 +112,24 @@ class CredentialsIdentityResolverRegistration(
112112

113113
override fun section(section: ServiceRuntimePluginSection): Writable = writable {
114114
when (section) {
115-
is ServiceRuntimePluginSection.IdentityResolver -> {
115+
is ServiceRuntimePluginSection.AdditionalConfig -> {
116116
rustTemplate(
117117
"""
118-
.identity_resolver(
119-
#{SIGV4_SCHEME_ID},
120-
#{CredentialsIdentityResolver}::new(self.handle.conf.credentials_cache())
121-
)
118+
cfg.set_identity_resolvers(
119+
#{IdentityResolvers}::builder()
120+
.identity_resolver(
121+
#{SIGV4_SCHEME_ID},
122+
#{CredentialsIdentityResolver}::new(self.handle.conf.credentials_cache())
123+
)
124+
.build()
125+
);
122126
""",
123127
"SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig)
124128
.resolve("auth::sigv4::SCHEME_ID"),
125129
"CredentialsIdentityResolver" to AwsRuntimeType.awsRuntime(runtimeConfig)
126130
.resolve("identity::credentials::CredentialsIdentityResolver"),
131+
"IdentityResolvers" to RuntimeType.smithyRuntimeApi(runtimeConfig)
132+
.resolve("client::identity::IdentityResolvers"),
127133
)
128134
}
129135
else -> {}

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,20 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
1515
import software.amazon.smithy.rust.codegen.core.rustlang.writable
1616
import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext
1717
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
18+
import software.amazon.smithy.rust.codegen.core.util.letIf
1819

20+
// TODO(enableNewSmithyRuntime): Delete this decorator since it's now in `codegen-client`
1921
class HttpConnectorDecorator : ClientCodegenDecorator {
2022
override val name: String = "HttpConnectorDecorator"
2123
override val order: Byte = 0
2224

2325
override fun configCustomizations(
2426
codegenContext: ClientCodegenContext,
2527
baseCustomizations: List<ConfigCustomization>,
26-
): List<ConfigCustomization> {
27-
return baseCustomizations + HttpConnectorConfigCustomization(codegenContext)
28-
}
28+
): List<ConfigCustomization> =
29+
baseCustomizations.letIf(!codegenContext.settings.codegenConfig.enableNewSmithyRuntime) {
30+
it + HttpConnectorConfigCustomization(codegenContext)
31+
}
2932
}
3033

3134
class HttpConnectorConfigCustomization(

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ private class AuthOperationRuntimePluginCustomization(private val codegenContext
136136
signing_options.normalize_uri_path = $normalizeUrlPath;
137137
signing_options.signing_optional = $signingOptional;
138138
signing_options.payload_override = #{payload_override};
139+
signing_options.request_timestamp = cfg.request_time().unwrap_or_default().system_time();
139140
140141
let mut sigv4_properties = #{PropertyBag}::new();
141142
sigv4_properties.insert(#{SigV4OperationSigningConfig} {

aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,9 @@ mod orchestrator {
135135
use aws_smithy_http::endpoint::SharedEndpointResolver;
136136
use aws_smithy_runtime::client::connections::adapter::DynConnectorAdapter;
137137
use aws_smithy_runtime::client::orchestrator::endpoints::DefaultEndpointResolver;
138+
use aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError;
138139
use aws_smithy_runtime_api::client::interceptors::{
139-
Interceptor, InterceptorContext, InterceptorError, Interceptors,
140+
Interceptor, InterceptorContext, Interceptors,
140141
};
141142
use aws_smithy_runtime_api::client::orchestrator::{
142143
BoxError, ConfigBagAccessors, Connection, HttpRequest, HttpResponse, TraceProbe,
@@ -156,7 +157,7 @@ mod orchestrator {
156157
impl RuntimePlugin for ManualServiceRuntimePlugin {
157158
fn configure(&self, cfg: &mut ConfigBag) -> Result<(), BoxError> {
158159
let identity_resolvers =
159-
aws_smithy_runtime_api::client::orchestrator::IdentityResolvers::builder()
160+
aws_smithy_runtime_api::client::identity::IdentityResolvers::builder()
160161
.identity_resolver(
161162
aws_runtime::auth::sigv4::SCHEME_ID,
162163
aws_runtime::identity::credentials::CredentialsIdentityResolver::new(

aws/sra-test/integration-tests/aws-sdk-s3/tests/interceptors.rs

Lines changed: 0 additions & 103 deletions
This file was deleted.

aws/sra-test/integration-tests/aws-sdk-s3/tests/sra_test.rs

Lines changed: 16 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use aws_credential_types::cache::{CredentialsCache, SharedCredentialsCache};
77
use aws_credential_types::provider::SharedCredentialsProvider;
88
use aws_http::user_agent::{ApiMetadata, AwsUserAgent};
9-
use aws_runtime::auth::sigv4::SigV4OperationSigningConfig;
109
use aws_runtime::recursion_detection::RecursionDetectionInterceptor;
1110
use aws_runtime::user_agent::UserAgentInterceptor;
1211
use aws_sdk_s3::config::{Credentials, Region};
@@ -23,7 +22,7 @@ use aws_smithy_runtime::client::orchestrator::endpoints::DefaultEndpointResolver
2322
use aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError;
2423
use aws_smithy_runtime_api::client::interceptors::{Interceptor, InterceptorContext, Interceptors};
2524
use aws_smithy_runtime_api::client::orchestrator::{
26-
BoxError, ConfigBagAccessors, Connection, HttpRequest, HttpResponse, TraceProbe,
25+
BoxError, ConfigBagAccessors, Connection, HttpRequest, HttpResponse, RequestTime, TraceProbe,
2726
};
2827
use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;
2928
use aws_smithy_runtime_api::config_bag::ConfigBag;
@@ -33,8 +32,6 @@ use aws_types::SigningService;
3332
use std::sync::Arc;
3433
use std::time::{Duration, UNIX_EPOCH};
3534

36-
mod interceptors;
37-
3835
// TODO(orchestrator-test): unignore
3936
#[ignore]
4037
#[tokio::test]
@@ -83,21 +80,6 @@ async fn sra_manual_test() {
8380

8481
impl RuntimePlugin for ManualServiceRuntimePlugin {
8582
fn configure(&self, cfg: &mut ConfigBag) -> Result<(), BoxError> {
86-
let identity_resolvers =
87-
aws_smithy_runtime_api::client::orchestrator::IdentityResolvers::builder()
88-
.identity_resolver(
89-
aws_runtime::auth::sigv4::SCHEME_ID,
90-
aws_runtime::identity::credentials::CredentialsIdentityResolver::new(
91-
self.credentials_cache.clone(),
92-
),
93-
)
94-
.identity_resolver(
95-
"anonymous",
96-
aws_smithy_runtime_api::client::identity::AnonymousIdentityResolver::new(),
97-
)
98-
.build();
99-
cfg.set_identity_resolvers(identity_resolvers);
100-
10183
let http_auth_schemes =
10284
aws_smithy_runtime_api::client::orchestrator::HttpAuthSchemes::builder()
10385
.auth_scheme(
@@ -107,6 +89,7 @@ async fn sra_manual_test() {
10789
.build();
10890
cfg.set_http_auth_schemes(http_auth_schemes);
10991

92+
// Set an empty auth option resolver to be overridden by operations that need auth.
11093
cfg.set_auth_option_resolver(
11194
aws_smithy_runtime_api::client::auth::option_resolver::AuthOptionListResolver::new(
11295
Vec::new(),
@@ -142,31 +125,26 @@ async fn sra_manual_test() {
142125

143126
cfg.put(SigningService::from_static("s3"));
144127
cfg.put(SigningRegion::from(Region::from_static("us-east-1")));
145-
146-
#[derive(Debug)]
147-
struct OverrideSigningTimeInterceptor;
148-
impl Interceptor<HttpRequest, HttpResponse> for OverrideSigningTimeInterceptor {
149-
fn read_before_signing(
150-
&self,
151-
_context: &InterceptorContext<HttpRequest, HttpResponse>,
152-
cfg: &mut ConfigBag,
153-
) -> Result<(), BoxError> {
154-
let mut signing_config =
155-
cfg.get::<SigV4OperationSigningConfig>().unwrap().clone();
156-
signing_config.signing_options.request_timestamp =
157-
UNIX_EPOCH + Duration::from_secs(1624036048);
158-
cfg.put(signing_config);
159-
Ok(())
160-
}
161-
}
128+
cfg.set_request_time(RequestTime::new(
129+
UNIX_EPOCH + Duration::from_secs(1624036048),
130+
));
162131

163132
cfg.put(ApiMetadata::new("unused", "unused"));
164133
cfg.put(AwsUserAgent::for_tests()); // Override the user agent with the test UA
165134
cfg.get::<Interceptors<HttpRequest, HttpResponse>>()
166135
.expect("interceptors set")
167136
.register_client_interceptor(Arc::new(UserAgentInterceptor::new()) as _)
168-
.register_client_interceptor(Arc::new(RecursionDetectionInterceptor::new()) as _)
169-
.register_client_interceptor(Arc::new(OverrideSigningTimeInterceptor) as _);
137+
.register_client_interceptor(Arc::new(RecursionDetectionInterceptor::new()) as _);
138+
cfg.set_identity_resolvers(
139+
aws_smithy_runtime_api::client::identity::IdentityResolvers::builder()
140+
.identity_resolver(
141+
aws_runtime::auth::sigv4::SCHEME_ID,
142+
aws_runtime::identity::credentials::CredentialsIdentityResolver::new(
143+
self.credentials_cache.clone(),
144+
),
145+
)
146+
.build(),
147+
);
170148
Ok(())
171149
}
172150
}

0 commit comments

Comments
 (0)