Still working on getting client credential flow complete, most of the request works but still working on generating the JWT.
This commit is contained in:
parent
1a8c63808a
commit
8782ef39c6
80 changed files with 1331 additions and 414 deletions
|
|
@ -1,5 +1,7 @@
|
|||
using System.Security.Cryptography;
|
||||
using FluentValidation;
|
||||
using IdentityShroud.Core.Contracts;
|
||||
using IdentityShroud.Core.EFCore;
|
||||
using IdentityShroud.Core.Model;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
|
|
@ -8,24 +10,35 @@ namespace IdentityShroud.Core.Services;
|
|||
public class ClientService(
|
||||
Db db,
|
||||
IDataEncryptionService cryptor,
|
||||
IValidator<ClientCreateRequest> clientCreateValidator,
|
||||
IClock clock) : IClientService
|
||||
{
|
||||
public async Task<Result<Client>> Create(Guid realmId, ClientCreateRequest request, CancellationToken ct = default)
|
||||
{
|
||||
clientCreateValidator.ValidateAndThrow(request);
|
||||
|
||||
Realm realm = await db.Realms.FirstOrDefaultAsync(e => e.Id == realmId, ct)
|
||||
?? throw new InvalidOperationException("Require the id of an existing realm");
|
||||
|
||||
Client client = new()
|
||||
{
|
||||
RealmId = realmId,
|
||||
ClientId = request.ClientId,
|
||||
Name = request.Name,
|
||||
Description = request.Description,
|
||||
SignatureAlgorithm = request.SignatureAlgorithm,
|
||||
AllowClientCredentialsFlow = request.AllowClientCredentialsFlow ?? false,
|
||||
SignatureAlgorithm = request.SignatureAlgorithm is null ? null : new(request.SignatureAlgorithm),
|
||||
Confidential = request.Confidential,
|
||||
AllowClientCredentialsFlow = request.AllowClientCredentialsFlow,
|
||||
CreatedAt = clock.UtcNow(),
|
||||
};
|
||||
|
||||
if (client.AllowClientCredentialsFlow)
|
||||
if (request.GenerateSecret is true)
|
||||
{
|
||||
client.Secrets.Add(CreateSecret());
|
||||
await db.Entry(realm).Collection(r => r.DataEncryptionKeys)
|
||||
.Query()
|
||||
.LoadAsync(ct);
|
||||
|
||||
client.Secrets.Add(CreateSecret(realm));
|
||||
}
|
||||
|
||||
await db.AddAsync(client, ct);
|
||||
|
|
@ -50,15 +63,17 @@ public class ClientService(
|
|||
return await db.Clients.FirstOrDefaultAsync(c => c.Id == id && c.RealmId == realmId, ct);
|
||||
}
|
||||
|
||||
private ClientSecret CreateSecret()
|
||||
private ClientSecret CreateSecret(Realm realm)
|
||||
{
|
||||
Span<byte> secret = stackalloc byte[24];
|
||||
RandomNumberGenerator.Fill(secret);
|
||||
|
||||
var dek = realm.DataEncryptionKeys.Single(k => k.Active);
|
||||
|
||||
return new ClientSecret()
|
||||
{
|
||||
CreatedAt = clock.UtcNow(),
|
||||
Secret = cryptor.Encrypt(secret.ToArray()),
|
||||
Secret = cryptor.Encrypt(dek, secret),
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue