2017-03-27 4 views
5

Unser Facebook Login funktioniert momentan nicht. Wir haben eine Nachricht von Facebook Developer Portal erhalten:Version Verfall Facebook Grafik API v2.2

„Name der App“ hat derzeit Zugriff auf Graph API v2.2, die das Ende ihrer 2 Jahre Lebensdauer 2017. am 27. März erreichen, um sicherzustellen, ein reibungsloser Übergang, migrieren Sie bitte alle Aufrufe zu Graph API v2.3 oder höher.

Um zu überprüfen, ob Ihre App von diesem Upgrade betroffen ist, können Sie das Version Upgrade Tool verwenden. Dies zeigt Ihnen, welche Anrufe, falls vorhanden, von dieser Änderung betroffen sind, sowie alle Ersatzanrufe in neueren Versionen. Wenn Sie keine Anrufe sehen, wird diese Änderung möglicherweise nicht von Ihrer App beeinflusst.

Sie können auch unser Änderungsprotokoll verwenden, um die vollständige Liste der Änderungen in allen Graph API-Versionen anzuzeigen.

Wir verwenden ASP.NET MVC 5, und wir verwenden oder Authentifizierung wie folgt aus:

var facebookAuthenticationOptions = new FacebookAuthenticationOptions() 
      { 
       AppId = "****", 
       AppSecret = "****", 
       AuthenticationType = "Facebook", 
       SignInAsAuthenticationType = "ExternalCookie", 
       Provider = new FacebookAuthenticationProvider 
       { 
        OnAuthenticated = async ctx => ctx.Identity.AddClaim(new Claim(ClaimTypes.Email, ctx.User["email"].ToString())) 
       } 
      }; 

      facebookAuthenticationOptions.Scope.Add("email"); 

Aber heute unser Login Info-Objekt ist null in ExternalLoginCallback:

 [HttpGet] 
     [AllowAnonymous] 
     [RequireHttps] 
     public async Task<ActionResult> ExternalLoginCallback(string returnUrl = null) 
     { 
      try 
      { 
       var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
       if (loginInfo == null) 
       { 
        return RedirectToAction("Login"); 
       } 
... more code here... 

In Facebook Dev. Portal unsere API Version ist 2.3

Wir haben viele Optionen getestet haben, ohne Ergebnisse:

Access email address in the OAuth ExternalLoginCallback from Facebook v2.4 API in ASP.NET MVC 5

Why new fb api 2.4 returns null email on MVC 5 with Identity and oauth 2?

Vielen Dank viel für die Hilfe.

+1

die Lösung Siehe hier: http: // stackoverflow.com/questions/22364442/asp-net-mvc5-owin-facebook-authentication-suddenly-not-working die Antwort von sammy34 –

+0

@ MarcHägele thank Sie, nachdem Sie Ihrem Link gefolgt sind, konnte ich mein Problem dank Sammy34's Antwort lösen. – Alisson

Antwort

9

Ich hatte das gleiche Problem und hier ist, wie ich es geschafft habe, es zu beheben und die E-Mail von Facebook zu bekommen.

  • -Update folgende NuGet Pacakges
    • Microsoft.Owin auf Version 3.1.0-rc1
    • Microsoft.Owin.Security auf Version 3.1.0-rc1
    • Microsoft.Owin.Security.Cookies auf Version 3.1.0-rc1
    • Microsoft.Owin.Security.OAuth auf Version 3.1.0-rc1
    • Microsoft.Owin.Security.Facebook auf Version 3.1.0-rc1

Sie dann den folgenden Code in die Identity Startup Klasse hinzufügen

var facebookOptions = new FacebookAuthenticationOptions() 
     { 
      AppId = "your app id", 
      AppSecret = "your app secret", 
      BackchannelHttpHandler = new FacebookBackChannelHandler(), 
      UserInformationEndpoint = "https://graph.facebook.com/v2.8/me?fields=id,name,email,first_name,last_name", 
      Scope = { "email" } 
     }; 

     app.UseFacebookAuthentication(facebookOptions); 

Dies ist die Definition der Klasse für FacebookBackChannelHandler():

using System; 
using System.Net.Http; 

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

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

Dies ist total die komplette Lösung, die ich implementiert habe, guter Punkt – chemitaxis

+0

Das ist unglaublich ... schlecht schlecht OWIN Team ... werde versuchen, komm später zu dir, meine App ist tot, weil –

+0

@ @ user3012760 ist das Paket erforderlich Aktualisierung? weil RC1-Pakete für die spanische Sprache immer noch nicht verfügbar sind. –

0

Aktualisieren Sie einfach alle Referenz im Zusammenhang mit OWIN Die neueste OWIN-Version ist 3.1.0rc1.

Dies beheben die Login-Taste, nicht die E-Mail, ich kann nicht herausfinden, diese Frage.

+0

Es behebt die Anmelde-Schaltfläche speziell, weil Facebook den Antworttyp der Authentifizierungs-Token-Anforderung für JSON aktualisiert hat, die MS Owin 3.0.1 nicht verarbeiten konnte. –

+1

Ich habe auf rc1 aktualisiert und es behoben. Aber ich muss den Code einer Antwort – chemitaxis

+0

nett einfügen, werde ich auch darauf schauen. – HolloW

0

Wenn Sie schräges Update Owin Pakete wegen der Sprachpakete (wie in meinem Fall) können Sie

  1. Ändern Sie die Identität Startklassencode:

    var facebookOptions = new FacebookAuthenticationOptions() 
    { 
        AppId = "your app id", 
        AppSecret = "your app secret", 
        BackchannelHttpHandler = new FacebookBackChannelHandler(), 
        UserInformationEndpoint = "https://graph.facebook.com/v2.8/me?fields=id,name,email,first_name,last_name", 
        Scope = { "email" } 
    }; 
    
    app.UseFacebookAuthentication(facebookOptions); 
    
  2. Dies ist die Definition der Klasse für FacebookBackChannelHandler():

    public class FacebookBackChannelHandler : HttpClientHandler 
    { 
        protected override async System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) 
        { 
         if (!request.RequestUri.AbsolutePath.Contains("/oauth")) 
         { 
          request.RequestUri = new Uri(request.RequestUri.AbsoluteUri.Replace("?access_token", "&access_token")); 
         } 
    
         var result = await base.SendAsync(request, cancellationToken); 
         if (!request.RequestUri.AbsolutePath.Contains("/oauth")) 
         { 
          return result; 
         } 
    
         var content = await result.Content.ReadAsStringAsync(); 
         var facebookOauthResponse = JsonConvert.DeserializeObject<FacebookOauthResponse>(content); 
    
         var outgoingQueryString = HttpUtility.ParseQueryString(string.Empty); 
         outgoingQueryString.Add(nameof(facebookOauthResponse.access_token), facebookOauthResponse.access_token); 
         outgoingQueryString.Add(nameof(facebookOauthResponse.expires_in), facebookOauthResponse.expires_in + string.Empty); 
         outgoingQueryString.Add(nameof(facebookOauthResponse.token_type), facebookOauthResponse.token_type); 
         var postdata = outgoingQueryString.ToString(); 
    
         var modifiedResult = new HttpResponseMessage(HttpStatusCode.OK) 
         { 
          Content = new StringContent(postdata) 
         }; 
    
         return modifiedResult; 
        } 
    } 
    
    private class FacebookOauthResponse 
    { 
        public string access_token { get; set; } 
        public long expires_in { get; set; } 
        public string token_type { get; set; } 
    } 
    
Verwandte Themen