2
2
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3
3
4
4
using Microsoft . Extensions . Logging ;
5
+ using System . Threading ;
5
6
6
7
namespace Duende . AccessTokenManagement ;
7
8
8
9
/// <summary>
9
10
/// Implements token management logic
10
11
/// </summary>
11
- public class ClientCredentialsTokenManagementService : IClientCredentialsTokenManagementService
12
+ public class ClientCredentialsTokenManagementService (
13
+ IClientCredentialsTokenEndpointService clientCredentialsTokenEndpointService ,
14
+ IClientCredentialsTokenCache tokenCache ,
15
+ ILogger < ClientCredentialsTokenManagementService > logger
16
+ ) : IClientCredentialsTokenManagementService
12
17
{
13
- private readonly ITokenRequestSynchronization _sync ;
14
- private readonly IClientCredentialsTokenEndpointService _clientCredentialsTokenEndpointService ;
15
- private readonly IClientCredentialsTokenCache _tokenCache ;
16
- private readonly ILogger < ClientCredentialsTokenManagementService > _logger ;
17
-
18
- /// <summary>
19
- /// ctor
20
- /// </summary>
21
- /// <param name="sync"></param>
22
- /// <param name="clientCredentialsTokenEndpointService"></param>
23
- /// <param name="tokenCache"></param>
24
- /// <param name="logger"></param>
25
- public ClientCredentialsTokenManagementService (
26
- ITokenRequestSynchronization sync ,
27
- IClientCredentialsTokenEndpointService clientCredentialsTokenEndpointService ,
28
- IClientCredentialsTokenCache tokenCache ,
29
- ILogger < ClientCredentialsTokenManagementService > logger )
30
- {
31
- _sync = sync ;
32
- _clientCredentialsTokenEndpointService = clientCredentialsTokenEndpointService ;
33
- _tokenCache = tokenCache ;
34
- _logger = logger ;
35
- }
36
18
37
19
/// <inheritdoc/>
38
20
public async Task < ClientCredentialsToken > GetAccessTokenAsync (
@@ -46,47 +28,34 @@ public async Task<ClientCredentialsToken> GetAccessTokenAsync(
46
28
{
47
29
try
48
30
{
49
- var item = await _tokenCache . GetAsync ( clientName , parameters , cancellationToken ) . ConfigureAwait ( false ) ;
31
+ var item = await tokenCache . GetAsync (
32
+ clientName : clientName ,
33
+ requestParameters : parameters ,
34
+ cancellationToken : cancellationToken ) . ConfigureAwait ( false ) ;
50
35
if ( item != null )
51
36
{
52
37
return item ;
53
38
}
54
39
}
55
40
catch ( Exception e )
56
41
{
57
- _logger . LogError ( e ,
42
+ logger . LogError ( e ,
58
43
"Error trying to obtain token from cache for client {clientName}. Error = {error}. Will obtain new token." ,
59
44
clientName , e . Message ) ;
60
45
}
61
46
}
62
47
63
- return await _sync . SynchronizeAsync ( clientName , async ( ) =>
64
- {
65
- var token = await _clientCredentialsTokenEndpointService . RequestToken ( clientName , parameters , cancellationToken ) . ConfigureAwait ( false ) ;
66
- if ( token . IsError )
67
- {
68
- _logger . LogError (
69
- "Error requesting access token for client {clientName}. Error = {error}." ,
70
- clientName , token . Error ) ;
71
-
72
- return token ;
73
- }
74
-
75
- try
76
- {
77
- await _tokenCache . SetAsync ( clientName , token , parameters , cancellationToken ) . ConfigureAwait ( false ) ;
78
- }
79
- catch ( Exception e )
80
- {
81
- _logger . LogError ( e ,
82
- "Error trying to set token in cache for client {clientName}. Error = {error}" ,
83
- clientName , e . Message ) ;
84
- }
85
-
86
- return token ;
87
- } ) . ConfigureAwait ( false ) ;
48
+ return await tokenCache . GetOrCreateAsync (
49
+ clientName : clientName ,
50
+ requestParameters : parameters ,
51
+ factory : InvokeGetAccessToken ,
52
+ cancellationToken : cancellationToken ) . ConfigureAwait ( false ) ;
88
53
}
89
54
55
+ private async Task < ClientCredentialsToken > InvokeGetAccessToken ( string clientName , TokenRequestParameters parameters , CancellationToken cancellationToken )
56
+ {
57
+ return await clientCredentialsTokenEndpointService . RequestToken ( clientName , parameters , cancellationToken ) . ConfigureAwait ( false ) ;
58
+ }
90
59
91
60
/// <inheritdoc/>
92
61
public Task DeleteAccessTokenAsync (
@@ -95,6 +64,6 @@ public Task DeleteAccessTokenAsync(
95
64
CancellationToken cancellationToken = default )
96
65
{
97
66
parameters ??= new TokenRequestParameters ( ) ;
98
- return _tokenCache . DeleteAsync ( clientName , parameters , cancellationToken ) ;
67
+ return tokenCache . DeleteAsync ( clientName , parameters , cancellationToken ) ;
99
68
}
100
69
}
0 commit comments