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

Alura.WebAPI.Api - GET User Current After Request in "Incluir"

Gostaria de saber qual a melhor estratégia para recuperar o usuário atual após a autenticação via token JWT.

Exemplo:

Caso fosse necessário adicionar o usuário de criação do Livro no controller Livros2Controller.cs, método Incluir.

Desde já, agradeço.

3 respostas

Mateus, boa tarde.

Para recuperar informações sobre o usuário logado é necessário consultar o objeto do tipo HttpContext. Lá tem uma propriedade User. O AspNet já desserializou o token JWT e armazenou as informações ali.

Espero ter ajudado.

Daniel, bom dia.

Tentei utilizar o HttpContext através da interface IHttpContextAccessor para ter acesso ao currentUser mas sem sucesso.

 [HttpPost]
        [SwaggerOperation(
            Summary = "Registra novo livro na base.",
            Tags = new[] {"Livros"}
            )]
        [ProducesResponseType(statusCode: 201, Type = typeof(LivroApi))]
        [ProducesResponseType(statusCode: 400, Type = typeof(ErroResponse))]
        [ProducesResponseType(statusCode: 500, Type = typeof(ErroResponse))]
        public IActionResult Incluir([FromForm] LivroUpload model)
        {
            if (ModelState.IsValid)
            {
                var currentUser = _accessor.HttpContext.User;
                var livro = model.ToLivro();
                _repo.Incluir(livro); 
                var uri = Url.Action("Recuperar", new { id = livro.Id });
                return Created(uri, livro.ToApi()); //201
            }
            return BadRequest(ErroResponse.FromModelStateError(ModelState));
        }

Navegando pelo "User" só tive acesso ao Sub da Claim criada após o login na criação do token, que no caso é o model.Login do usuário.

 var direitos = new[]
                    {
                        new Claim(JwtRegisteredClaimNames.Sub, model.Login),
                        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
                    };

Poderia informar um exemplo ou links sobre o assunto.

Desde já, agradeço.

solução!

Fala, Mateus, td certo?

Olha, dentro de um controlador vc já tem disponível uma propriedade HttpContext. Não é necessário usar o IHttpContextAcessor, só quando está fora do contexto do AspNet Core, blz?

Então como recuperar o model.Login? Abaixo coloquei um exemplo acessando a propriedade HttpContext dentro de uma action. Veja que depois do Claims seu código é puramente Linq.

var login = HttpContext.User.Claims
                .Where(c => c.Type == JwtRegisteredClaimNames.Sub)
                .Select(c => c.Value)
                .First();

Se precisar de outras informações é só guardá-las como uma claim na hora de gerar o token e usar o código acima com o tipo adequado.

Espero ter ajudado.