Skip to content

Commit daf820b

Browse files
feature(#22): this commit introduces secret rotation service integration to JWT token handling and tests
1 parent 8e18f8e commit daf820b

4 files changed

Lines changed: 18 additions & 2 deletions

File tree

Applications/Backend/Source/HttpsRichardy.Federation.Infrastructure/Security/JwtSecurityTokenService.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public sealed class JwtSecurityTokenService(
55
ITokenCollection tokenCollection,
66
IRealmProvider realmProvider,
77
IGroupCollection groupCollection,
8+
ISecretRotationService secretRotationService,
89
IHostInformationProvider host
910
) : ISecurityTokenService
1011
{
@@ -223,7 +224,17 @@ private async Task<RsaSecurityKey> GetPrivateKeyAsync(CancellationToken cancella
223224
var secrets = await secretCollection.GetSecretsAsync(filters, cancellation);
224225
var secret = secrets
225226
.OrderByDescending(secret => secret.CreatedAt)
226-
.First();
227+
.FirstOrDefault();
228+
229+
if (secret is null)
230+
{
231+
await secretRotationService.EnsureSecretExistsAsync(realm, cancellation);
232+
233+
secrets = await secretCollection.GetSecretsAsync(filters, cancellation);
234+
secret = secrets
235+
.OrderByDescending(secret => secret.CreatedAt)
236+
.FirstOrDefault() ?? throw new InvalidOperationException($"no signing key available for realm '{realm.Id}'.");
237+
}
227238

228239
var key = Common.Utilities.RsaHelper.CreateSecurityKeyFromPrivateKey(secret.PrivateKey);
229240

Applications/Backend/Source/HttpsRichardy.Federation.Infrastructure/Security/SecretRotationService.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,11 @@ public async Task RotateSecretAsync(Realm realm, CancellationToken cancellation
8888
return;
8989
}
9090

91+
await CreateSecretAsync(realm, cancellation);
92+
9193
current.ExpiresAt = now;
9294
current.GracePeriodEndsAt = now.Add(_gracePeriod);
9395

9496
await secretCollection.UpdateAsync(current, cancellation: cancellation);
95-
await CreateSecretAsync(realm, cancellation);
9697
}
9798
}

Applications/Backend/Tests/Integration/Security/AuthenticationServiceTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public sealed class AuthenticationServiceTests :
1515
private readonly Mock<IRealmProvider> _realmProvider = new();
1616
private readonly Mock<IHostInformationProvider> _hostProvider = new();
1717
private readonly Mock<ISecretCollection> _secretCollection = new();
18+
private readonly Mock<ISecretRotationService> _secretRotationService = new();
1819
private readonly Mock<IGroupCollection> _groupCollection = new();
1920

2021
public AuthenticationServiceTests(MongoDatabaseFixture mongoFixture)
@@ -56,6 +57,7 @@ public AuthenticationServiceTests(MongoDatabaseFixture mongoFixture)
5657
tokenCollection: tokenCollection,
5758
realmProvider: _realmProvider.Object,
5859
groupCollection: _groupCollection.Object,
60+
secretRotationService: _secretRotationService.Object,
5961
host: _hostProvider.Object
6062
);
6163

Applications/Backend/Tests/Integration/Security/JwtSecurityTokenServiceTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public sealed class JwtSecurityTokenServiceTests : IClassFixture<MongoDatabaseFi
1111

1212
private readonly Mock<IRealmProvider> _realmProvider = new();
1313
private readonly Mock<ISecretCollection> _secretCollection = new();
14+
private readonly Mock<ISecretRotationService> _secretRotationService = new();
1415
private readonly Mock<IHostInformationProvider> _hostProvider = new();
1516
private readonly Mock<IGroupCollection> _groupCollection = new();
1617

@@ -50,6 +51,7 @@ public JwtSecurityTokenServiceTests(MongoDatabaseFixture fixture)
5051
realmProvider: _realmProvider.Object,
5152
secretCollection: _secretCollection.Object,
5253
groupCollection: _groupCollection.Object,
54+
secretRotationService: _secretRotationService.Object,
5355
tokenCollection: _tokenCollection,
5456
host: _hostProvider.Object
5557
);

0 commit comments

Comments
 (0)