2015-07-30 6 views
19

Z v2.3 interfejsu API Facebooka, pod warunkiem, że ustawiono następujące parametry, adres e-mail użytkowników zostanie zwrócony na oddzwonieniu do ExternalLoginCallback;Dostęp do adresu e-mail w OAuth ExternalLoginCallback z interfejsu API Facebook v2.4 w ASP.NET MVC 5

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

Jednak każda aplikacja, która może kierować tylko V2.4 (wydany 08 lipca) nie zwraca adres e-mail do ExternalLoginCallback.

Myślę, że może to być związane ze zmianami v2.4 z listy here;

Declarative Fields

To try to improve performance on mobile networks, Nodes and Edges in v2.4 requires that you explicitly request the field(s) you need for your GET requests. For example, GET /v2.4/me/feed no longer includes likes and comments by default, but GET /v2.4/me/feed?fields=comments,likes will return the data. For more details see the docs on how to request specific fields.

Jak mogę uzyskać dostęp do tego adresu e-mailowego teraz?

Odpowiedz

55

Aby rozwiązać ten problem, musiałem zainstalować Facebook SDK for .NET z nuget i osobno przetestować adres e-mail.

W metodzie ExternalLoginCallback dodałem warunek do wypełnienia adresu e-mail z interfejsu API Graph 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; 
} 

I dostać FacebookAccessToken ja przedłużony 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); 
     } 
    } 
}); 
+0

Witam, jak nazywa się ta biblioteka biblioteki Facebooka? Chciałbym wiedzieć. dzięki. – Yovav

+0

Świetnie! zadziałało. teraz próbuję uzyskać inne wartości user_birthday - jakikolwiek pomysł, jak to zrobić? – Yovav

+4

@ Yovav check out [api] (https://developers.facebook.com/docs/graph-api/reference/user). Mówi, że musisz wyświetlić listę wszystkich żądanych pól, więc domyślam się, że jeśli zmienisz zapytanie na '/ me? Fields = email, birthday', otrzymasz wiadomość e-mail i datę urodzenia w odpowiedzi. –

13

W MVC 6 (Asp.net rdzenia 1.0), konfigurując FacebookAuthentication w startup.cs tak:

  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"; 
      }); 

mogę dostać e-mail. Np.:

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

Twój przykład dotyczy [tag: asp.net-mvc-6]. Dodatkowo znalazłem, że dla [tag: asp.net-mvc-6] nie musiałem dodawać 'email' do zakresu, było to domyślnie dostępne. –

+0

Przykro mi z tego powodu. ASP.NET 5/Core 1 i MVC 6 wciąż mają bałagan w mojej głowie. –

+0

W rzeczywistości okazało się, że to rozwiązanie działa również dla MVC 5 - specjalnie dodanie UserInformationEndpoint powyżej było kluczem do zapełnienia wiadomości e-mail – Xcalibur

Powiązane problemy