net bearer asp c# angular authentication google-oauth asp.net-core-webapi

c# - bearer - ASP.net core web api: uso del token de acceso Facebook/Google OAuth para la autenticación



authentication c# asp net core (2)

Si entiendo correctamente, ya tienes tu token de usuario de Facebook del SDK de Facebook a través de tu aplicación.
Al igual que usted, no pude encontrar cómo hacerlo con una biblioteca / paquete ASP.NET Core. Así que volví a lo básico.
Acabo de llamar a un punto final de mi api con el token de Facebook, lo comparo con el api del gráfico de Facebook y, si está bien, registro al usuario (si es necesario) y devuelvo mi token JWT como si el usuario hubiera iniciado sesión con una ruta de usuario / contraseña clásica.

[HttpPost] [AllowAnonymous] [Route("api/authentication/FacebookLogin")] public async Task<IActionResult> FacebookLogin([FromBody] FacebookToken facebookToken) { //check token var httpClient = new HttpClient { BaseAddress = new Uri("https://graph.facebook.com/v2.9/") }; var response = await httpClient.GetAsync($"me?access_token={facebookToken.Token}&fields=id,name,email,first_name,last_name,age_range,birthday,gender,locale,picture"); if (!response.IsSuccessStatusCode) return BadRequest(); var result = await response.Content.ReadAsStringAsync(); var facebookAccount = JsonConvert.DeserializeObject<FacebookAccount>(result); //register if required var facebookUser = _context.FacebookUsers.SingleOrDefault(x => x.Id == facebookAccount.Id); if (facebookUser == null) { var user = new ApplicationUser {UserName = facebookAccount.Name, Email = facebookAccount.Email}; var result2 = await _userManager.CreateAsync(user); if (!result2.Succeeded) return BadRequest(); facebookUser = new FacebookUser {Id = facebookAccount.Id, UserId = user.Id}; _context.FacebookUsers.Add(facebookUser); _context.SaveChanges(); } //send bearer token return Ok(GetToken(facebookUser.UserId)); }

Ahora, durante varios días, estoy intentando que la autenticación OAuth con Google y Facebook funcione dentro de mi proyecto de API web principal de ASP.net.

mi estado actual es:

  • Tengo un proyecto de Web Api central de ASP.net en el que los usuarios necesitan ser autenticados
  • Tengo una aplicación web angular 2 que debería usar mi API web (con autenticación)
  • Tengo una aplicación para Android, que debería usar mi API web (con autenticación)

mi meta es:

  • Uso de Google / Facebook como proveedores de OAuth para iniciar sesión
  • Más tarde: agregar cuentas de usuario propias (probablemente con IdentityServer4)
  • no es necesario redirigir a un sitio web de inicio de sesión especial (como la solución IdentityServer4). Simplemente presiona el botón Facebook / Google en la aplicación, permite el acceso, ¡listo!

En mi aplicación para Android y angular, puedo recuperar los tokens de acceso de google / facebook. Ahora, quiero usar el flujo implícito de OAuth para autenticar al usuario en mi api web, con los tokens de acceso dados (colocando los tokens en el encabezado como token de portador)

Ahí está mi problema: ¿hay alguna forma genérica de hacer esto fácilmente? No quiero usar los SDK de facebook / google para esto.

He intentado lo siguiente:

  • utilizando IdentityServer4 : con esto puedo iniciar sesión con facebook / google en mi webapi, pero es necesario redireccionar a la página de inicio de sesión de IdentityServer4. ¿Hay alguna forma posible de simplemente presionar google / fb-Button en mi aplicación e iniciar sesión, sin redirigir a la página de inicio de sesión de identityServer?
  • usando el middleware de autenticación de google / facebook ( https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/ ): Pero no están validando mi token de portador enviado (probé innumerables maneras de lograr una adecuada validación). ¿Es esto incluso posible utilizar dentro de la web api?
  • tratando de usar Microsoft.AspNetCore.Authentication.JwtBearer-Middleware y poniendo las opciones necesarias para google / facebook por mí mismo, pero también no validando (así como innumerables intentos)

En los últimos días, he intentado tantas soluciones posibles, que estoy totalmente atascado y he perdido la pista de lo que tengo que hacer para lograrlo. En este punto, he leído casi todas las entradas de tutorial / stackoverflow de la API de asp.net web, pero no puedo entender cómo usar esto en mi caso como deseo. La mayoría de los tutoriales son solo para mvc-sitios web o usando IdentityServer4 con la redirección a su página de inicio de sesión.

¿Alguna sugerencia o solución? ¿Qué me estoy perdiendo?


Tienes que copiar el código personalizado disponible en este artículo en un medio

Crear una función en AccountController.cs

private async Task<ExternalLoginInfo> AuthenticationManager_GetExternalLoginInfoAsync_WithExternalBearer()

Y pega el código dado en el artículo.