2525import software .amazon .awssdk .auth .credentials .AwsCredentials ;
2626import software .amazon .awssdk .auth .credentials .AwsCredentialsProvider ;
2727import software .amazon .awssdk .auth .credentials .AwsSessionCredentials ;
28+ import software .amazon .awssdk .core .useragent .BusinessMetricFeatureId ;
2829import software .amazon .awssdk .services .sso .SsoClient ;
2930import software .amazon .awssdk .services .sso .internal .SessionCredentialsHolder ;
3031import software .amazon .awssdk .services .sso .model .GetRoleCredentialsRequest ;
3132import software .amazon .awssdk .services .sso .model .RoleCredentials ;
3233import software .amazon .awssdk .utils .SdkAutoCloseable ;
34+ import software .amazon .awssdk .utils .StringUtils ;
3335import software .amazon .awssdk .utils .builder .CopyableBuilder ;
3436import software .amazon .awssdk .utils .builder .ToCopyableBuilder ;
3537import software .amazon .awssdk .utils .cache .CachedSupplier ;
5153@ SdkPublicApi
5254public final class SsoCredentialsProvider implements AwsCredentialsProvider , SdkAutoCloseable ,
5355 ToCopyableBuilder <SsoCredentialsProvider .Builder , SsoCredentialsProvider > {
54- private static final String PROVIDER_NAME = "SsoCredentialsProvider" ;
56+ private static final String PROVIDER_NAME = BusinessMetricFeatureId . CREDENTIALS_SSO . value () ;
5557
5658 private static final Duration DEFAULT_STALE_TIME = Duration .ofMinutes (1 );
5759 private static final Duration DEFAULT_PREFETCH_TIME = Duration .ofMinutes (5 );
5860
5961 private static final String ASYNC_THREAD_NAME = "sdk-sso-credentials-provider" ;
6062
6163 private final Supplier <GetRoleCredentialsRequest > getRoleCredentialsRequestSupplier ;
64+ private final String source ;
6265
6366 private final SsoClient ssoClient ;
6467 private final Duration staleTime ;
@@ -77,6 +80,7 @@ private SsoCredentialsProvider(BuilderImpl builder) {
7780
7881 this .staleTime = Optional .ofNullable (builder .staleTime ).orElse (DEFAULT_STALE_TIME );
7982 this .prefetchTime = Optional .ofNullable (builder .prefetchTime ).orElse (DEFAULT_PREFETCH_TIME );
83+ this .source = builder .source ;
8084
8185 this .asyncCredentialUpdateEnabled = builder .asyncCredentialUpdateEnabled ;
8286 CachedSupplier .Builder <SessionCredentialsHolder > cacheBuilder =
@@ -95,11 +99,11 @@ private SsoCredentialsProvider(BuilderImpl builder) {
9599 */
96100 private RefreshResult <SessionCredentialsHolder > updateSsoCredentials () {
97101 SessionCredentialsHolder credentials = getUpdatedCredentials (ssoClient );
98- Instant acutalTokenExpiration = credentials .sessionCredentialsExpiration ();
102+ Instant actualTokenExpiration = credentials .sessionCredentialsExpiration ();
99103
100104 return RefreshResult .builder (credentials )
101- .staleTime (acutalTokenExpiration .minus (staleTime ))
102- .prefetchTime (acutalTokenExpiration .minus (prefetchTime ))
105+ .staleTime (actualTokenExpiration .minus (staleTime ))
106+ .prefetchTime (actualTokenExpiration .minus (prefetchTime ))
103107 .build ();
104108 }
105109
@@ -112,11 +116,19 @@ private SessionCredentialsHolder getUpdatedCredentials(SsoClient ssoClient) {
112116 .secretAccessKey (roleCredentials .secretAccessKey ())
113117 .sessionToken (roleCredentials .sessionToken ())
114118 .accountId (request .accountId ())
115- .providerName (PROVIDER_NAME )
119+ .providerName (providerName () )
116120 .build ();
117121 return new SessionCredentialsHolder (sessionCredentials , Instant .ofEpochMilli (roleCredentials .expiration ()));
118122 }
119123
124+ private String providerName () {
125+ String providerName = PROVIDER_NAME ;
126+ if (!StringUtils .isEmpty (this .source )) {
127+ providerName = String .format ("%s,%s" , this .source , providerName );
128+ }
129+ return providerName ;
130+ }
131+
120132 /**
121133 * The amount of time, relative to session token expiration, that the cached credentials are considered stale and
122134 * should no longer be used. All threads will block until the value is updated.
@@ -206,6 +218,12 @@ public interface Builder extends CopyableBuilder<Builder, SsoCredentialsProvider
206218 */
207219 Builder refreshRequest (Supplier <GetRoleCredentialsRequest > getRoleCredentialsRequestSupplier );
208220
221+ /**
222+ * An optional string list of {@link software.amazon.awssdk.core.useragent.BusinessMetricFeatureId} denoting previous
223+ * credentials providers that are chained with this one.
224+ */
225+ Builder source (String source );
226+
209227 /**
210228 * Create a {@link SsoCredentialsProvider} using the configuration applied to this builder.
211229 * @return
@@ -220,6 +238,7 @@ protected static final class BuilderImpl implements Builder {
220238 private Duration staleTime ;
221239 private Duration prefetchTime ;
222240 private Supplier <GetRoleCredentialsRequest > getRoleCredentialsRequestSupplier ;
241+ private String source ;
223242
224243 BuilderImpl () {
225244
@@ -231,6 +250,7 @@ public BuilderImpl(SsoCredentialsProvider provider) {
231250 this .staleTime = provider .staleTime ;
232251 this .prefetchTime = provider .prefetchTime ;
233252 this .getRoleCredentialsRequestSupplier = provider .getRoleCredentialsRequestSupplier ;
253+ this .source = provider .source ;
234254 }
235255
236256 @ Override
@@ -268,6 +288,12 @@ public Builder refreshRequest(Supplier<GetRoleCredentialsRequest> getRoleCredent
268288 return this ;
269289 }
270290
291+ @ Override
292+ public Builder source (String source ) {
293+ this .source = source ;
294+ return this ;
295+ }
296+
271297 @ Override
272298 public SsoCredentialsProvider build () {
273299 return new SsoCredentialsProvider (this );
0 commit comments