in src/ApiForFhirMigrationTool.Function/Security/BearerTokenHandler.cs [115:142]
public async Task<AccessToken> GetTokenAsync(string[] scopes, CancellationToken cancellationToken)
{
await _semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false);
try
{
if (_accessToken is null || _accessTokenExpiration <= DateTimeOffset.UtcNow + _tokenRefreshOffset)
{
try
{
_accessToken = await _tokenCredential.GetTokenAsync(new TokenRequestContext(scopes), cancellationToken).ConfigureAwait(false);
_accessTokenExpiration = _accessToken.Value.ExpiresOn;
}
catch (AuthenticationFailedException)
{
// If the token acquisition fails, retry after the delay.
await Task.Delay(_tokenRefreshRetryDelay, cancellationToken).ConfigureAwait(false);
_accessToken = await _tokenCredential.GetTokenAsync(new TokenRequestContext(scopes), cancellationToken).ConfigureAwait(false);
_accessTokenExpiration = _accessToken.Value.ExpiresOn;
}
}
return _accessToken.Value;
}
finally
{
_semaphoreSlim.Release();
}
}