Accedi all’e-mail in OAuth ExternalLoginCallback dall’API di Facebook v2.4 in ASP.NET MVC 5

Con la v2.3 dell’API di Facebook, a condizione che fosse impostato quanto segue, l’indirizzo e-mail degli utenti verrebbe restituito sul callback a ExternalLoginCallback ;

 app.UseFacebookAuthentication(new FacebookAuthenticationOptions { AppId = "XXX", AppSecret = "XXX", Scope = { "email" } }); 

Tuttavia, qualsiasi app che può solo indirizzare la v2.4 (rilasciata l’8 luglio) non restituisce più l’indirizzo di posta elettronica a ExternalLoginCallback .

Penso che questo possa essere collegato alle modifiche alla v2.4 come elencato qui ;

Campi dichiarativi

Per provare a migliorare le prestazioni su reti mobili, Nodi e Bordi nella versione 4.2 richiede che tu richieda esplicitamente i campi necessari per le tue richieste GET. Ad esempio, GET /v2.4/me/feed non include più like e commenti per impostazione predefinita, ma GET /v2.4/me/feed?fields=comments,likes restituirà i dati. Per maggiori dettagli vedi i documenti su come richiedere campi specifici.

Come posso accedere a questo indirizzo email ora?

Per risolvere questo problema ho dovuto installare Facebook SDK per .NET da nuget e interrogare l’indirizzo email separatamente.

Nel metodo ExternalLoginCallback , ho aggiunto un condizionale per popolare l’indirizzo email dall’API di Facebook Graph;

 var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); } // added the following lines if (loginInfo.Login.LoginProvider == "Facebook") { var identity = AuthenticationManager.GetExternalIdentity(DefaultAuthenticationTypes.ExternalCookie); var access_token = identity.FindFirstValue("FacebookAccessToken"); var fb = new FacebookClient(access_token); dynamic myInfo = fb.Get("/me?fields=email"); // specify the email field loginInfo.Email = myInfo.email; } 

E per ottenere FacebookAccessToken ho esteso ConfigureAuth ;

 app.UseFacebookAuthentication(new FacebookAuthenticationOptions { AppId = "XXX", AppSecret = "XXX", Scope = { "email" }, Provider = new FacebookAuthenticationProvider { OnAuthenticated = context => { context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken)); return Task.FromResult(true); } } }); 

In MVC 6 (Asp.net Core 1.0), configurando FacebookAuthentication in startup.cs in questo modo:

  app.UseFacebookAuthentication(options => { options.AppId = Configuration["Authentication:Facebook:AppId"]; options.AppSecret = Configuration["Authentication:Facebook:AppSecret"]; options.Scope.Add("email"); options.UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email,first_name,last_name"; }); 

Potrei ricevere l’email Vale a dire:

  var info = await _signInManager.GetExternalLoginInfoAsync(); var email = info.ExternalPrincipal.FindFirstValue(ClaimTypes.Email);