Comment obtenir l'image de profil google plus dans l'authentification c# MVC

je développe un C# ASP.NET application MVC 5 qui utilise Google sign in comme fournisseur par défaut. La fonctionnalité de connexion fonctionne bien et je peux obtenir l'adresse e-mail et le nom de l'utilisateur. Une chose que j'ai besoin est d'obtenir la photo de profil de l'utilisateur.

Comment puis-je y arriver?

Jusqu'à présent j'ai utilisé le MVC par défaut auth "UseGoogleAuthentication".

Microsoft.Owin.Security.Google.GoogleAuthenticationOptions a = new Microsoft.Owin.Security.Google.GoogleAuthenticationOptions();

var googleOption = new GoogleAuthenticationOptions()
{
    Provider = new GoogleAuthenticationProvider()
    {
         OnAuthenticated = (context) =>
         {
              var rawUserObjectFromFacebookAsJson = context.Identity;
              context.Identity.AddClaim(new Claim("urn:google:name", context.Identity.FindFirstValue(ClaimTypes.Name)));
              context.Identity.AddClaim(new Claim("urn:google:email", context.Identity.FindFirstValue(ClaimTypes.Email)));
              return Task.FromResult(0);
         }
    }
};

app.UseGoogleAuthentication(googleOption);

C'est comment je peux obtenir l'adresse e-mail. Mais que dire de l' photo de profil?

Dois-je utiliser une autre forme d'authentification?

12
demandé sur marc_s 2014-04-02 22:46:16

2 réponses

je sais que c'est une réponse tardive, mais trouvé votre question tout en travaillant sur le même problème. Voici ma solution.

au lieu d'utiliser GoogleAuthenticationOptions j'ai utilisé GoogleOAuth2AuthenticationOptions ce qui signifie que vous aurez besoin de mettre en place un projet à https://console.developers.google.com/project premier à obtenir un ClientId et ClientSecret .

  1. À ce lien ( https://console.developers.google.com/project ), créer un projet et ensuite le sélectionner.

  2. puis dans le menu de gauche, cliquez sur"APIs & auth".

  3. sous" APIs", assurez-vous que" Google+ API "est défini à"On".

  4. puis cliquez sur" Credentials " (dans le menu de gauche).

  5. puis cliquez sur le bouton "Créer un nouvel ID Client". Suivez les instructions et vous aurez alors un ClientId et ClientSecret , en prendre note.

Maintenant vous avez Ceux, le code GoogleOAuth2AuthenticationOptions ressemble à ceci:

var googleOptions = new GoogleOAuth2AuthenticationOptions()
{
    ClientId = [INSERT CLIENT ID HERE],
    ClientSecret = [INSERT CLIENT SECRET HERE],
    Provider = new GoogleOAuth2AuthenticationProvider()
    {
        OnAuthenticated = (context) =>
        {
            context.Identity.AddClaim(new Claim("urn:google:name", context.Identity.FindFirstValue(ClaimTypes.Name)));
            context.Identity.AddClaim(new Claim("urn:google:email", context.Identity.FindFirstValue(ClaimTypes.Email)));
            //This following line is need to retrieve the profile image
            context.Identity.AddClaim(new System.Security.Claims.Claim("urn:google:accesstoken", context.AccessToken, ClaimValueTypes.String, "Google"));

            return Task.FromResult(0);
        }
    }
};

app.UseGoogleAuthentication(googleOptions);

Avis que cela ajoute aussi le jeton d'accès comme une demande afin que nous puissions l'utiliser pour récupérer l'image de profil. Le bit suivant peut varier selon la configuration de votre projet, mais pour moi, c'était dans le AccountController .

dans ma méthode ExternalLoginCallback , je vérifie le fournisseur de connexion utilisé et traite les données pour Google login. Dans cette section, je récupère l'url de l'image de profil et la stocke dans une variable avec le code suivant:

//get access token to use in profile image request
var accessToken = loginInfo.ExternalIdentity.Claims.Where(c => c.Type.Equals("urn:google:accesstoken")).Select(c => c.Value).FirstOrDefault();
Uri apiRequestUri = new Uri("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + accessToken);
//request profile image
using (var webClient = new System.Net.WebClient())
{
    var json = webClient.DownloadString(apiRequestUri);
    dynamic result = JsonConvert.DeserializeObject(json);
    userPicture = result.picture;
}

utilise le token d'accès pour demander les informations utilisateur à google. Il récupère ensuite l'url de l'image à partir du retour de données json. Vous pouvez ensuite enregistrer l'url de la base de données la plus appropriée moyen pour votre projet.

Espère que ça aide quelqu'un.

28
répondu AndrewPolland 2014-06-09 10:46:17

ça pourrait être plus facile. Je ne sais pas si c'était toujours comme ça, Mais voici mon code (ASP.NET 5):

private static Task OnGoogleAuthenticated(GoogleAuthenticatedContext context)
{
    var identity = ((ClaimsIdentity)context.Principal.Identity);
    var pictureUrl = context.User["image"].Value<string>("url");
    // Pass the picture url as a claim to be used later in the application
    identity.AddClaim(new Claim("pictureUrl", pictureUrl));
    return Task.FromResult(0);
}

dans la boucle externe, le pictureUrl peut être récupéré directement en utilisant:

var info = await signInManager.GetExternalLoginInfoAsync();
...
var picture = info.ExternalPrincipal.FindFirstValue("pictureUrl");
6
répondu Guilherme Duarte 2015-06-03 09:30:40