|  | @@ -16,7 +16,6 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #endregion
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -using System;
 | 
	
		
			
				|  |  |  using System.Threading;
 | 
	
		
			
				|  |  |  using System.Threading.Tasks;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -43,6 +42,11 @@ namespace Grpc.Auth
 | 
	
		
			
				|  |  |          /// <returns>The interceptor.</returns>
 | 
	
		
			
				|  |  |          public static AsyncAuthInterceptor FromCredential(ITokenAccess credential)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | +            if (credential is ITokenAccessWithHeaders credentialWithHeaders)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return FromCredential(credentialWithHeaders);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              return new AsyncAuthInterceptor(async (context, metadata) =>
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  var accessToken = await credential.GetAccessTokenForRequestAsync(context.ServiceUrl, CancellationToken.None).ConfigureAwait(false);
 | 
	
	
		
			
				|  | @@ -50,6 +54,28 @@ namespace Grpc.Auth
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Creates an <see cref="AsyncAuthInterceptor"/> that will obtain access token and associated information
 | 
	
		
			
				|  |  | +        /// from any credential type that implements <see cref="ITokenAccessWithHeaders"/>
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        /// <param name="credential">The credential to use to obtain access tokens.</param>
 | 
	
		
			
				|  |  | +        /// <returns>The interceptor.</returns>
 | 
	
		
			
				|  |  | +        public static AsyncAuthInterceptor FromCredential(ITokenAccessWithHeaders credential)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            return new AsyncAuthInterceptor(async (context, metadata) => 
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                AccessTokenWithHeaders tokenAndHeaders = await credential.GetAccessTokenWithHeadersForRequestAsync(context.ServiceUrl, CancellationToken.None).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +                metadata.Add(CreateBearerTokenHeader(tokenAndHeaders.AccessToken));
 | 
	
		
			
				|  |  | +                foreach (var header in tokenAndHeaders.Headers)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    foreach (var headerValue in header.Value)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        metadata.Add(new Metadata.Entry(header.Key, headerValue));
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// Creates an <see cref="AsyncAuthInterceptor"/> that will use given access token as authorization.
 | 
	
		
			
				|  |  |          /// </summary>
 |