4.9 KiB
4.9 KiB
Task 10: Add OAuth Client Management
Task Description
Files:
- Create:
src/Fengling.AuthService/Models/OAuthApplication.cs - Create:
src/Fengling.AuthService/Controllers/OAuthClientsController.cs - Modify:
src/Fengling.AuthService/Data/ApplicationDbContext.cs
Implementation Steps
Step 1: Create OAuthApplication model
Create: src/Fengling.AuthService/Models/OAuthApplication.cs
namespace Fengling.AuthService.Models;
public class OAuthApplication
{
public long Id { get; set; }
public string ClientId { get; set; } = string.Empty;
public string? ClientSecret { get; set; }
public string DisplayName { get; set; } = string.Empty;
public string[] RedirectUris { get; set; } = Array.Empty<string>();
public string[] PostLogoutRedirectUris { get; set; } = Array.Empty<string>();
public string[] Scopes { get; set; } = Array.Empty<string>();
public string[] GrantTypes { get; set; } = Array.Empty<string>();
public string ClientType { get; set; } = "public";
public string ConsentType { get; set; } = "implicit";
public string Status { get; set; } = "active";
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public DateTime? UpdatedAt { get; set; }
}
Step 2: Update ApplicationDbContext
Edit: src/Fengling.AuthService/Data/ApplicationDbContext.cs
Add to context:
public DbSet<OAuthApplication> OAuthApplications { get; set; }
Add to OnModelCreating:
builder.Entity<OAuthApplication>(entity =>
{
entity.HasKey(e => e.Id);
entity.HasIndex(e => e.ClientId).IsUnique();
entity.Property(e => e.ClientId).HasMaxLength(100);
entity.Property(e => e.ClientSecret).HasMaxLength(200);
entity.Property(e => e.DisplayName).HasMaxLength(100);
entity.Property(e => e.ClientType).HasMaxLength(20);
entity.Property(e => e.ConsentType).HasMaxLength(20);
entity.Property(e => e.Status).HasMaxLength(20);
});
Step 3: Add migration
Run:
dotnet ef migrations add AddOAuthApplications
dotnet ef database update
Step 4: Create OAuthClientsController
Create: src/Fengling.AuthService/Controllers/OAuthClientsController.cs
using Fengling.AuthService.Data;
using Fengling.AuthService.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace Fengling.AuthService.Controllers;
[ApiController]
[Route("api/[controller]")]
public class OAuthClientsController : ControllerBase
{
private readonly ApplicationDbContext _context;
private readonly ILogger<OAuthClientsController> _logger;
public OAuthClientsController(
ApplicationDbContext context,
ILogger<OAuthClientsController> logger)
{
_context = context;
_logger = logger;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<OAuthApplication>>> GetClients()
{
return await _context.OAuthApplications.ToListAsync();
}
[HttpGet("{id}")]
public async Task<ActionResult<OAuthApplication>> GetClient(long id)
{
var client = await _context.OAuthApplications.FindAsync(id);
if (client == null)
{
return NotFound();
}
return client;
}
[HttpPost]
public async Task<ActionResult<OAuthApplication>> CreateClient(OAuthApplication application)
{
_context.OAuthApplications.Add(application);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetClient), new { id = application.Id }, application);
}
[HttpPut("{id}")]
public async Task<IActionResult> UpdateClient(long id, OAuthApplication application)
{
if (id != application.Id)
{
return BadRequest();
}
_context.Entry(application).State = EntityState.Modified;
await _context.SaveChangesAsync();
return NoContent();
}
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteClient(long id)
{
var client = await _context.OAuthApplications.FindAsync(id);
if (client == null)
{
return NotFound();
}
_context.OAuthApplications.Remove(client);
await _context.SaveChangesAsync();
return NoContent();
}
}
Step 5: Commit
git add src/Fengling.AuthService/Models/ src/Fengling.AuthService/Controllers/ src/Fengling.AuthService/Data/
git commit -m "feat(auth): add OAuth client management API"
Context
This task adds OAuth client management functionality for managing OAuth applications. This will be used by Fengling.Console to register and manage clients.
Tech Stack: EF Core, ASP.NET Core Controllers
Verification
- OAuthApplication model created
- DbSet added to ApplicationDbContext
- Migration generated and applied
- CRUD API endpoints created
- Build succeeds
- Committed to git
Notes
- Clients can be registered through this API
- Fengling.Console will be pre-registered in Task 11
- Status field enables client enable/disable