I have a Typed Client which i have configured in the services and i am using Polly to make retries for transient faults.
Aim: I want to make use of Polly to implement refresh token, whenever there is a 401 response from the target site, i want Polly to refresh the token and continue the initial request again.
The problem is the typed client has all the api methods and the refresh token method, when the request is initiated from the typed client how do i access the typed client again to call the refresh token and continue the initial request?
The 'Context' in onRetry provides some support to add any object to the dictionary, but i am unable to access the SetPolicyExecutionContext('someContext') method and i do not want to add this on all the methods before initiating the call as there's whole lot of API.
// In Service Configuration
// Refresh token policy
var refreshTokenPolicy = Polly.Policy.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.Unauthorized)
.RetryAsync(1, (response, retrycount, context)) =>
{
if(response.Result.StatusCode == HttpStatusCode.Unauthorized)
{
// Perform refresh token
}
}
// Typed Client
services.AddHttpClient<TypedClient>();
public class TypedClient
{
private static HttpClient _client;
public TypedClient(HttpClient client)
{
_client = client;
}
public string ActualCall()
{
// some action
}
public string RefreshToken()
{
// Refresh the token and return
}
}
To use the refresh token, make a POST request to the service's token endpoint with grant_type=refresh_token , and include the refresh token as well as the client credentials if required.
The authorization server can contain this risk by detecting refresh token reuse using refresh token rotation. If your application uses refresh token rotation, it can now store it in local storage or browser memory.
RefreshTokenExpiration. Absolute the refresh token will expire on a fixed point in time (specified by the AbsoluteRefreshTokenLifetime). This is the default. Sliding when refreshing the token, the lifetime of the refresh token will be renewed (by the amount specified in SlidingRefreshTokenLifetime).
You can useAddPolicyHandler
which has an overload that passesIServiceProvider
. So all you need to do is something like:
services.AddHttpClient<TypedClient>()
.AddPolicyHandler((provider, request) =>
{
return Policy.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.Unauthorized)
.RetryAsync(1, (response, retryCount, context) =>
{
var client = provider.GetRequiredService<TypedClient>();
// refresh auth token.
});
});
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With