Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

É uma boa prática retornar um throw na API?

Boa Noite!

É uma boa prática retornar um throw na API? Sendo que isso vai demonstra para quem for consumir a minha API a linha e o arquivo que foi gerado o erro.

Se não é uma boa pratica para colocar em produção, qual seria o melhor jeito para fazer esses retornos em caso de falha ou negado?

public async Task<string> Login(LoginUsuarioDto dto)
        {
            var resultado = await _signInManager.PasswordSignInAsync(dto.Username, dto.Password, false, false);

            if (!resultado.Succeeded)
            {
                throw new ApplicationException("Usuário não autenticado!");
            }

            var usuario = _signInManager
                .UserManager
                .Users
                .FirstOrDefault(user => user.NormalizedUserName == dto.Username.ToUpper());

            var token = _tokenService.GenerateToken(usuario);

            return token;

        }
2 respostas
solução!

Olá, Maurici!

Retornar um throw na API pode ser uma prática válida em alguns casos, pois permite que você informe detalhes sobre o erro ocorrido, como a linha e o arquivo onde ocorreu. No entanto, é importante considerar que essa abordagem pode expor informações sensíveis sobre a implementação da sua API, o que pode ser um risco de segurança.

Uma alternativa mais segura é utilizar o retorno de códigos de status HTTP adequados para indicar falhas ou negações na sua API. Por exemplo, você pode retornar um código 401 (Unauthorized) quando o usuário não estiver autenticado. Além disso, você pode incluir uma mensagem de erro no corpo da resposta, fornecendo informações úteis para quem está consumindo a API.

No seu exemplo, em vez de lançar uma exceção com a mensagem "Usuário não autenticado!", você poderia retornar um código 401 e incluir essa mensagem no corpo da resposta. Algo assim:

public async Task<ActionResult<string>> Login(LoginUsuarioDto dto)
{
    var resultado = await _signInManager.PasswordSignInAsync(dto.Username, dto.Password, false, false);

    if (!resultado.Succeeded)
    {
        return Unauthorized("Usuário não autenticado!");
    }

    var usuario = _signInManager
        .UserManager
        .Users
        .FirstOrDefault(user => user.NormalizedUserName == dto.Username.ToUpper());

    var token = _tokenService.GenerateToken(usuario);

    return token;
}

Dessa forma, quem consumir a sua API receberá um código 401 e a mensagem "Usuário não autenticado!" no corpo da resposta, sem expor detalhes internos da implementação.

Dê uma olhada também no padrão Result é um padrão de mercado, ainda sem "formalização" de um livro, e acho que pode ser uma alternativa interessante também.

The Operation Result Pattern — A Simple Guide

FluentResults => Lib em .NET que ajuda a implementar o padrão Result

Result Object Pattern

The Operation Result Pattern

My take on the Result class in C#

Espero ter ajudado e bons estudos!

Maravilha, obrigado! Vou estudar os tópicos que você relacionou para mim.