120 lines
4.9 KiB
C#
120 lines
4.9 KiB
C#
using Asp.Versioning;
|
|
using Core.Thalos.Application.UseCases.Users.Input;
|
|
using Core.Thalos.BuildingBlocks;
|
|
using Core.Thalos.External.Clients.Thalos.Requests.Users;
|
|
using LSA.Dashboard.External.Clients.Dashboard;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace Core.Thalos.BFF.Api.Controllers
|
|
{
|
|
/// <summary>
|
|
/// Handles all requests for Authentication.
|
|
/// </summary>
|
|
[ApiVersion(MimeTypes.ApplicationVersion)]
|
|
[Route("api/v{api-version:apiVersion}/[controller]")]
|
|
[Produces(MimeTypes.ApplicationJson)]
|
|
[Consumes(MimeTypes.ApplicationJson)]
|
|
[ApiController]
|
|
public class AuthenticationController(
|
|
IThalosServiceClient thalosServiceClient,
|
|
ILogger<AuthenticationController> logger,
|
|
ITokenService tokenService,
|
|
IGoogleAuthorization googleAuthorization) : BaseController(logger)
|
|
{
|
|
[HttpGet]
|
|
public IActionResult Authorize() => Ok(googleAuthorization.GetAuthorizationUrl());
|
|
|
|
[HttpGet("callback")]
|
|
public async Task<IActionResult> Callback(string code)
|
|
{
|
|
var userCredential = await googleAuthorization.ExchangeCodeForToken(code);
|
|
|
|
return Ok(new { Token = userCredential!.Token.IdToken });
|
|
}
|
|
/// <summary>
|
|
/// Get token for user.
|
|
/// </summary>
|
|
/// <returns>A <see cref="UserAdapter"/> representing
|
|
/// the asynchronous execution of the service.</returns>
|
|
/// <response code="200">The Token was generated.</response>
|
|
/// <response code="500">The service internal error.</response>
|
|
[HttpGet]
|
|
[Route(Routes.GenerateToken)]
|
|
[ProducesResponseType(typeof(UserAdapter), StatusCodes.Status200OK)]
|
|
[Authorize(AuthenticationSchemes = Schemes.GoogleScheme)]
|
|
public async Task<IActionResult> GenerateTokenService(CancellationToken cancellationToken)
|
|
{
|
|
try
|
|
{
|
|
logger.LogInformation($"{nameof(GenerateTokenService)} - Request received - Payload: {null}");
|
|
|
|
var tokenAdapter = new TokenAdapter();
|
|
|
|
var email = tokenService.GetEmailClaim(this.HttpContext);
|
|
|
|
if (string.IsNullOrEmpty(email)) return BadRequest("An error ocurred while desearializing the token");
|
|
|
|
var tokenResult = await Handle(() => thalosServiceClient.GetTokenAdapterService(new GetTokenAdapterRequest { Email = email }, cancellationToken)).ConfigureAwait(false);
|
|
|
|
if (tokenResult is ObjectResult tokenOkResult && tokenOkResult.StatusCode == 200)
|
|
tokenAdapter = tokenOkResult.Value as TokenAdapter;
|
|
else
|
|
return tokenResult;
|
|
|
|
if (tokenAdapter is not null && tokenAdapter.User is not null)
|
|
{
|
|
var (token, modules) = tokenService.GenerateAccessToken(tokenAdapter);
|
|
|
|
await Handle(() => thalosServiceClient.LoginUserService(new LoginUserRequest { Email = email }, cancellationToken)).ConfigureAwait(false);
|
|
|
|
return Ok(new { token, modules });
|
|
}
|
|
else
|
|
{
|
|
return BadRequest("An error ocurred");
|
|
}
|
|
}
|
|
|
|
catch (Exception ex)
|
|
{
|
|
logger.LogError($"{nameof(GenerateTokenService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload : {null}");
|
|
throw;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Refreshes the custom access token.
|
|
/// </summary>
|
|
/// <returns>A <see cref="UserAdapter"/> representing
|
|
/// the asynchronous execution of the service.</returns>
|
|
/// <response code="200">The user with it's new token.</response>
|
|
/// <response code="500">The service internal error.</response>
|
|
[HttpGet]
|
|
[Route(Routes.RefreshToken)]
|
|
[ProducesResponseType(typeof(UserAdapter), StatusCodes.Status200OK)]
|
|
[Authorize(AuthenticationSchemes = Schemes.DefaultScheme)]
|
|
public async Task<IActionResult> RefreshCustomTokenAsync(CancellationToken cancellationToken)
|
|
{
|
|
var tokenAdapter = new TokenAdapter();
|
|
var email = tokenService.GetEmailClaim(this.HttpContext);
|
|
|
|
var tokenResult = await Handle(() => thalosServiceClient.GetTokenAdapterService(new GetTokenAdapterRequest { Email = email }, cancellationToken)).ConfigureAwait(false);
|
|
|
|
if (tokenResult is ObjectResult tokenOkResult && tokenOkResult.StatusCode == 200)
|
|
{
|
|
tokenAdapter = tokenOkResult.Value as TokenAdapter;
|
|
|
|
if (tokenAdapter != null)
|
|
{
|
|
var result = tokenService.RefreshAccessToken(HttpContext, tokenAdapter);
|
|
return result;
|
|
}
|
|
}
|
|
else return tokenResult;
|
|
|
|
return new UnauthorizedObjectResult("Error in refreshToken");
|
|
}
|
|
}
|
|
}
|