5

Ich lerne, wie man mit OWIN externe Authentifizierung mit dem Standard-MVC-Vorlage in VS 2015 zu arbeiten. Ich habe Facebook Auth aktiviert und den Bereich "E-Mail" hinzugefügt, in der Erwartung der Benutzer E-Mail von Facebook zurückgegeben werden nachdem der Benutzer authentifiziert wurde (gemäß this). Dennoch befindet sich keine E-Mail im Kontext. Benutzer-JSON-Objekt und context.Email sind ebenfalls null.Abrufen von Benutzern Facebook-E-Mail auf OWIN Login

Dies wird der entsprechende Code in Startup.Auth.cs

var facebookOptions = new FacebookAuthenticationOptions 
     { 
      AppId = "XXXXXX", 
      AppSecret = "XXXXXX", 
      Provider = new FacebookAuthenticationProvider 
      { 
       OnAuthenticated = context => 
       { 
        // Retrieve the OAuth access token to store for subsequent API calls 
        var accessToken = context.AccessToken; 

        // Retrieve the username 
        var facebookUserName = context.UserName; 

        // WHY IS IT EMPTY? 
        var facebookEmail = context.Email; 

        // You can even retrieve the full JSON-serialized user 
        var serializedUser = context.User; 

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

     facebookOptions.Scope.Add("email"); 

     app.UseFacebookAuthentication(facebookOptions); 

Irgendwelche Ideen, was fehlt? Warum wird die Facebook-E-Mail-Adresse nicht zurückgegeben?

+4

Potenziell nützlichen Informationen hier: http: //stackoverflow.com/a/32636149/3130094 –

+1

Danke @JamieDunstan - das war hilfreich! – Andrey

Antwort

4

Es stellte sich heraus, dass es eine bahnbrechende Änderung in Facebook API v 2.4 gab, wo Sie Felder angeben müssen, die Sie abrufen möchten. Die Grafik-Anforderung verwendet werden:

https://graph.facebook.com/v2.3/me?access_token=XXXXX 

aber aus Leistungsgründen ab FB API v2.4 Sie müssen auch angeben, fileds Sie im Rahmen abrufen möchten:

https://graph.facebook.com/v2.4/me?fields=id,name,email&access_token=XXXXX 

Microsoft FB-Client-Implementierung Standardmäßig wird an der Abfrage-String als "access_token?", die auf die gebrochene Anfrage führt (extra Fragezeichen) access_token:

https://graph.facebook.com/v2.4/me?fields=id,name,email?access_token=XXXXX

Um dies zu beheben, müssen wir einen benutzerdefinierten BackchannelHttpHandler verwenden. Erstens haben wir die Endpunkt-Klasse erstellen:

public class FacebookBackChannelHandler : HttpClientHandler 
    { 
     protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
     { 
      if (!request.RequestUri.AbsolutePath.Contains("/oauth")) 
      { 
       request.RequestUri = new Uri(request.RequestUri.AbsoluteUri.Replace("?access_token", "&access_token")); 
      } 

      return await base.SendAsync(request, cancellationToken); 
     } 
    } 

Und dann bieten wir es in Facebook Auth Optionen zusammen mit expliziter Angabe UserInformationEndpoint:

var facebookAuthOptions = new FacebookAuthenticationOptions 
     { 
      AppId = ConfigurationManager.AppSettings["FacebookAppId"], 
      AppSecret = ConfigurationManager.AppSettings["FacebookAppSecret"], 
      BackchannelHttpHandler = new FacebookBackChannelHandler(), 
      UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email", 
      Scope = { "email" } 
      <.....> 
     }; 

Von: https://stackoverflow.com/a/32636149/3130094

Verwandte Themen