Skip to content

Commit e657325

Browse files
wip
1 parent bf929ca commit e657325

File tree

1 file changed

+57
-0
lines changed
  • access-token-management/test/AccessTokenManagement.Tests/Framework

1 file changed

+57
-0
lines changed

access-token-management/test/AccessTokenManagement.Tests/Framework/AppHost.cs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,57 @@
1111
using Duende.AccessTokenManagement.OpenIdConnect;
1212
using RichardSzalay.MockHttp;
1313
using System.Net.Http.Json;
14+
using System.Security.Claims;
15+
using System.Text.Json;
16+
using Microsoft.Extensions.Options;
17+
using Duende.IdentityServer;
18+
using System.Threading;
19+
using Microsoft.Extensions.Logging;
1420

1521
namespace Duende.AccessTokenManagement.Tests;
1622

23+
public class TokenRefresher(
24+
IStoreTokensInAuthenticationProperties tokensInProps,
25+
IOptions<UserTokenManagementOptions> options,
26+
IUserTokenRequestSynchronization sync,
27+
IUserTokenEndpointService tokenEndpointService,
28+
IUserTokenStore userAccessTokenStore,
29+
TimeProvider clock,
30+
ILogger<UserAccessAccessTokenManagementService> logger)
31+
32+
{
33+
public async Task ValidateToken(ClaimsPrincipal? user, AuthenticationProperties contextProperties,
34+
CancellationToken cancellationToken)
35+
{
36+
var userToken = tokensInProps.GetUserToken(contextProperties);
37+
var dtRefresh = userToken.Expiration.Subtract(options.Value.RefreshBeforeExpiration);
38+
var utcNow = clock.GetUtcNow();
39+
40+
var parameters = new UserTokenRequestParameters();
41+
42+
if (dtRefresh < utcNow)
43+
{
44+
//await sync.SynchronizeAsync(userToken.RefreshToken!, async () =>
45+
//{
46+
var refreshedToken =
47+
await tokenEndpointService.RefreshAccessTokenAsync(userToken, parameters, cancellationToken).ConfigureAwait(false);
48+
if (refreshedToken.IsError)
49+
{
50+
logger.LogError("Error refreshing access token. Error = {error}", refreshedToken.Error);
51+
}
52+
else
53+
{
54+
await userAccessTokenStore.StoreTokenAsync(user, refreshedToken, parameters).ConfigureAwait(false);
55+
}
56+
57+
//return null;
58+
//}).ConfigureAwait(false);
59+
}
60+
61+
}
62+
63+
}
64+
1765
public class AppHost : GenericHost
1866
{
1967
public string ClientId;
@@ -44,11 +92,20 @@ private void ConfigureServices(IServiceCollection services)
4492
{
4593
services.AddRouting();
4694
services.AddAuthorization();
95+
services.AddTransient<TokenRefresher>();
4796

4897
services.AddAuthentication("cookie")
4998
.AddCookie("cookie", options =>
5099
{
51100
options.Cookie.Name = "bff";
101+
102+
options.Events.OnValidatePrincipal += async context =>
103+
{
104+
var refresher = context.HttpContext.RequestServices.GetRequiredService<TokenRefresher>();
105+
106+
await refresher.ValidateToken(context.Principal, context.Properties, context.HttpContext.RequestAborted);
107+
};
108+
52109
});
53110

54111
services.AddAuthentication(options =>

0 commit comments

Comments
 (0)