using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Sozsoft.Mcp.Dtos;
using Sozsoft.Mcp.Services;
using Sozsoft.Platform.Localization;
using Volo.Abp;
using Volo.Abp.Application.Services;
namespace Sozsoft.Mcp;
///
/// Dinamik istemci kaydi (RFC 7591). Uc kimlik dogrulamasizdir; istemci ne alirsa alsin token
/// kullanicinin kendi girisiyle ve kendi yetkileriyle uretilir. Kural ve kayit
/// icindedir.
///
[AllowAnonymous]
public class McpOAuthAppService : ApplicationService, IMcpOAuthAppService
{
private const string AuthorizationCodeGrant = "authorization_code";
private const string RefreshTokenGrant = "refresh_token";
private readonly IMcpOAuthClientManager clientManager;
public McpOAuthAppService(IMcpOAuthClientManager clientManager)
{
this.clientManager = clientManager;
LocalizationResource = typeof(PlatformResource);
}
public async Task RegisterClientAsync(McpClientRegistrationRequestDto input)
{
Check.NotNull(input, nameof(input));
var redirectUris = (input.RedirectUris ?? []).Distinct(StringComparer.Ordinal).ToList();
var registration = await clientManager.RegisterAsync(input.ClientName, redirectUris);
return registration.Error switch
{
McpClientRegistrationError.InvalidRedirectUri => new McpClientRegistrationResultDto
{
Error = "invalid_redirect_uri",
ErrorDescription = L[McpErrorCodes.RedirectUriNotAllowed, registration.ErrorValue ?? string.Empty]
},
McpClientRegistrationError.LimitReached => new McpClientRegistrationResultDto
{
Error = "invalid_client_metadata",
ErrorDescription = L[McpErrorCodes.RegistrationLimitReached, registration.ErrorValue ?? string.Empty]
},
_ => new McpClientRegistrationResultDto
{
ClientId = registration.ClientId,
ClientName = input.ClientName,
RedirectUris = redirectUris,
// Istemci hangi akislari isterse istesin gecerli olanlar bunlardir; RFC 7591
// sunucunun istenen degerleri daraltmasina izin verir.
GrantTypes = [AuthorizationCodeGrant, RefreshTokenGrant],
ResponseTypes = ["code"],
Scope = string.Join(' ', McpConsts.OAuthScopes),
ClientIdIssuedAt = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
}
};
}
}