fengling-console/Controllers/OAuthClientsController.cs
Sam 61c3a27192 feat: 添加OAuth2认证配置和实现
添加OAuth2认证相关配置文件和服务实现,包括环境变量配置、PKCE流程支持、token管理等功能。主要变更:
- 新增OAuth2配置文件
- 实现OAuth2服务层
- 更新请求拦截器支持token自动刷新
- 修改认证API和store以支持OAuth2流程
2026-02-07 17:47:11 +08:00

152 lines
4.1 KiB
C#

using Fengling.Console.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Fengling.Console.Controllers;
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class OAuthClientsController : ControllerBase
{
private readonly IOAuthClientService _service;
private readonly ILogger<OAuthClientsController> _logger;
public OAuthClientsController(
IOAuthClientService service,
ILogger<OAuthClientsController> logger)
{
_service = service;
_logger = logger;
}
[HttpGet]
public async Task<ActionResult<object>> GetClients(
[FromQuery] int page = 1,
[FromQuery] int pageSize = 10,
[FromQuery] string? displayName = null,
[FromQuery] string? clientId = null,
[FromQuery] string? status = null)
{
try
{
var (items, totalCount) = await _service.GetClientsAsync(page, pageSize, displayName, clientId, status);
return Ok(new
{
items,
totalCount,
page,
pageSize
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Error getting clients");
return StatusCode(500, new { message = ex.Message });
}
}
[HttpGet("options")]
public ActionResult<object> GetClientOptions()
{
return Ok(_service.GetClientOptions());
}
[HttpGet("{id}")]
public async Task<ActionResult<object>> GetClient(string id)
{
try
{
var client = await _service.GetClientAsync(id);
if (client == null)
{
return NotFound();
}
return Ok(client);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error getting client {Id}", id);
return StatusCode(500, new { message = ex.Message });
}
}
[HttpPost]
public async Task<ActionResult<object>> CreateClient([FromBody] CreateClientDto dto)
{
try
{
var result = await _service.CreateClientAsync(dto);
return StatusCode(201, result);
}
catch (InvalidOperationException ex)
{
return BadRequest(new { message = ex.Message });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error creating client");
return StatusCode(500, new { message = ex.Message });
}
}
[HttpPost("{id}/generate-secret")]
public async Task<ActionResult> GenerateSecret(string id)
{
try
{
var result = await _service.GenerateSecretAsync(id);
return Ok(result);
}
catch (KeyNotFoundException ex)
{
return NotFound(new { message = ex.Message });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error generating secret for client {Id}", id);
return StatusCode(500, new { message = ex.Message });
}
}
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteClient(string id)
{
try
{
await _service.DeleteClientAsync(id);
return NoContent();
}
catch (KeyNotFoundException ex)
{
return NotFound(new { message = ex.Message });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error deleting client {Id}", id);
return StatusCode(500, new { message = ex.Message });
}
}
[HttpPut("{id}")]
public async Task<IActionResult> UpdateClient(string id, [FromBody] UpdateClientDto dto)
{
try
{
await _service.UpdateClientAsync(id, dto);
return NoContent();
}
catch (KeyNotFoundException ex)
{
return NotFound(new { message = ex.Message });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error updating client {Id}", id);
return StatusCode(500, new { message = ex.Message });
}
}
}