Autenticação Firebase (JWT) com .NET Core
Estou desenvolvendo uma API simples que lida com autenticação feita pelo Firebase - para ser usada posteriormente com clientes Android.
Portanto, no console do Firebase, ativei os métodos de login do Facebook e do Google e criei uma página html de amostra que posso usá-la para testar o método de login - essa próxima função é chamada por um botão:
function loginFacebook() {
var provider = new firebase.auth.FacebookAuthProvider();
var token = "";
firebase.auth().signInWithPopup(provider).then(function (result) {
var token = result.credential.accessToken;
var user = result.user;
alert("login OK");
user.getToken().then(function (t) {
token = t;
loginAPI();
});
}).catch(function (error) {
var errorCode = error.code;
var errorMessage = error.message;
alert(errorCode + " - " + errorMessage);
});
}
Em seguida, uso o token e o envio à minha API com uma simples chamada ajax do jQuery aqui:
function loginAPI()
{
$.ajax({
url: "http://localhost:58041/v1/Users/",
dataType: 'json',
type: 'GET',
beforeSend: function (xhr) {
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Authorization", "Bearer " + token);
},
error: function (ex) {
console.log(ex.status + " - " + ex.statusText);
},
success: function (data) {
console.log(data);
return data;
}
});
}
Próxima parada: o back-end da API - escrito com o .NET Core.
Sob a inicialização, configurei o JwtBearer Auth (pacoteMicrosoft.AspNetCore.Authentication.JwtBearer
):
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
IncludeErrorDetails = true,
Authority = "https://securetoken.google.com/PROJECT-ID",
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "https://securetoken.google.com/PROJECT-ID",
ValidateAudience = true,
ValidAudience = "PROJECT-ID",
ValidateLifetime = true,
},
});
E aqui está o código do controlador - com o[Authorize]
atributo:
[Authorize]
[Route("v1/[controller]")]
public class UsersController : Controller
{
private readonly ILogger _logger;
private readonly UserService _userService;
public UsersController(ILogger<UsersController> logger, UserService userService)
{
_logger = logger;
_userService = userService;
}
[HttpGet]
public async Task<IList<User>> Get()
{
return await _userService.GetAll();
}
}
A resposta da API é 200 OK (HttpContext.User.Identity.IsAuthenticated
étrue
dentro do controlador), mas acho que não deveria. Meu problema é que não tenho certeza absoluta de que isso seja seguro.
Como isso está verificando a parte da assinatura do token JWT? Eu vi muitos exemplos de código mencionando o algoritmo x509 ou RS256, onde eles se encaixam nisso? Não deve verificar algum tipo de certificado ou chave privada com oIssuerSigningKey
ouTokenDecryptionKey
deTokenValidationParameters
classe? O que estou perdendo?
Fontes de conhecimento relevantes sobre o problema:
https://blog.markvincze.com/secure-an-asp-net-core-api-with-firebase/SPA - Firebase e autenticação .Net WebApi 2https://stormpath.com/blog/token-authentication-asp-net-corehttps://jwt.io/https://firebase.google.com/docs/auth/admin/verify-id-tokens