添加OAuth2认证相关配置文件和服务实现,包括环境变量配置、PKCE流程支持、token管理等功能。主要变更: - 新增OAuth2配置文件 - 实现OAuth2服务层 - 更新请求拦截器支持token自动刷新 - 修改认证API和store以支持OAuth2流程
152 lines
4.1 KiB
C#
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 });
|
|
}
|
|
}
|
|
}
|