Estou tentando implementar a autenticação do Google na minha API do ASP.NET Core 8 usando JWT (sem cookies), mas continuo recebendo este erro:
InvalidOperationException: O manipulador de autenticação registrado para o esquema 'Bearer' é 'JwtBearerHandler', que não pode ser usado para SignInAsync. Você esqueceu de chamar AddAuthentication().AddCookie("Cookies") e SignInAsync("Cookies",...)?
Este é meu código:
Program.cs
:
var key = Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Secret"]);
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
})
.AddGoogle(options =>
{
var googleAuth = builder.Configuration.GetSection("GoogleAuth");
options.ClientId = googleAuth["ClientId"];
options.ClientSecret = googleAuth["ClientSecret"];
options.CallbackPath = "/auth/signin-google";
options.SaveTokens = true;
})
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
// Validation parameters...
};
});
Controlador:
[HttpGet("login")]
public IActionResult Login()
{
var redirectUrl = Url.Action(nameof(GoogleResponse),"Auth");
var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
return Challenge(properties, GoogleDefaults.AuthenticationScheme);
}
[HttpGet("signin-google")]
public async Task<IActionResult> GoogleResponse()
{
// Error occurs here...
var result = await HttpContext.AuthenticateAsync(GoogleDefaults.AuthenticationScheme);
}
Você está usando tokens de portador JWT para autenticação na sua API ASP.NET Core e também adicionou a autenticação do Google como um provedor externo. A principal confusão surge ao tentar chamar
SignInAsync
e esperar que o aplicativo "faça login" no usuário como um aplicativo web tradicional.Mas aqui está o problema:
JwtBearerHandlercl
é um manipulador somente de validação. Ele não suporta login, pois espera que tokens sejam passados no cabeçalho de autorização e não gera nem armazena tokens.SignInAsync
foi projetado para autenticação baseada em cookies, onde cria um tíquete de autenticação local (por exemplo, configurando um cookie). É por isso que a exceção sugere adicioná -la.AddCookie()
— ela pressupõe que você queira fazer login por meio de cookies.Portanto, ao usar autenticação sem estado baseada em JWT, você não deve usar
SignInAsync
nem depender de cookies.