web-dev-qa-db-fra.com

API web principale ASP.net: utilisation de Facebook / Google OAuth jeton d'accès pour l'authentification

Depuis plusieurs jours, j'essaie d'obtenir l'authentification OAuth avec Google et Facebook pour travailler dans mon projet d'api web ASP.net.

mon statut actuel est:

  • J'ai un projet Web Api de base ASP.net dans lequel les utilisateurs doivent être authentifiés
  • J'ai une application web angular 2 qui devrait utiliser mon API web (avec authentification)
  • J'ai une Android, qui devrait utiliser mon API Web (avec authentification)

mon objectif est:

  • Utilisation de Google/Facebook en tant que OAuth pour la connexion)
  • plus tard: ajouter ses propres comptes d'utilisateurs (probablement avec IdentityServer4)
  • pas besoin de rediriger vers un site Web de connexion spécial (comme la solution IdentityServer4). Appuyez simplement sur le bouton facebook/google dans l'application, autorisez l'accès, c'est fait!

Dans mon Android et angular je suis en mesure de récupérer les jetons d'accès de google/facebook. Maintenant, je veux utiliser le OAuth flux implicite, pour authentifier l'utilisateur sur mon API web, avec les jetons d'accès donnés (en mettant les jetons dans l'en-tête comme jeton de porteur)

Il y a mon problème: existe-t-il un moyen générique de le faire facilement? Je ne veux pas utiliser les SDK facebook/google pour cela.

J'ai essayé de suivre:

  • en utilisant IdentityServer4 : Avec cela, je peux me connecter avec facebook/google sur mon webapi, mais il faut une redirection vers la page de connexion IdentityServer4. Existe-t-il un moyen possible de simplement cliquer sur le bouton google/fb dans mon application et de se connecter, sans redirection vers la page de connexion d’identityServer?
  • en utilisant le middleware d'authentification google/facebook ( https://docs.Microsoft.com/en-us/aspnet/core/security/ authentification/social / ): Mais ils ne valident pas mon jeton de porteur envoyé (essayé d'innombrables façons d'obtenir une validation appropriée). Est-ce même possible d'utiliser dans l'API Web?
  • essayer d'utiliser Microsoft.AspNetCore.Authentication.JwtBearer-Middleware et mettre les options nécessaires pour google/facebook par moi-même, mais aussi ne pas valider (ainsi d'innombrables tentatives)

Au cours des derniers jours, j'ai essayé tellement de solutions possibles que je suis totalement coincé et perdu de vue ce que je dois faire pour y parvenir. À ce stade, j'ai lu presque toutes les API web asp.net oauth tutorial/stackoverflow entry mais je ne peux pas comprendre comment utiliser cela dans mon cas comme je le souhaite. La plupart des tutoriels sont juste pour mvc -Sites Web ou en utilisant IdentityServer4 avec la redirection vers sa page de connexion.

Des suggestions ou des solutions? Qu'est-ce que je rate?

18
Rul3r

Si je comprends bien, vous avez déjà votre jeton d'utilisateur Facebook à partir du SDK Facebook via votre application.
Comme vous, je n'ai pas trouvé comment le faire avec une bibliothèque/un package ASP.NET Core. Je suis donc revenu à l'essentiel.
. nom d'utilisateur/mot de passe.

[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));
}
15
François