[c#] Warum gibt der neue fb api 2.4 bei MVC 5 mit Identity und oauth 2 null Emails zurück?


2 Answers

Für mich wurde dieses Problem durch ein Upgrade auf Microsoft.Owin.Security.Facebook 3.1.0 und Hinzufügen von "E-Mail" zur Fields Sammlung behoben:

var options = new FacebookAuthenticationOptions
{
    AppId = "-------",
    AppSecret = "------",    
};
options.Scope.Add("public_profile");
options.Scope.Add("email");

//add this for facebook to actually return the email and name
options.Fields.Add("email");
options.Fields.Add("name");

app.UseFacebookAuthentication(options);
Question

Alles funktionierte perfekt, bis es von fb auf 2.4 aktualisiert wurde (ich hatte 2.3 in meinem vorherigen Projekt).

Heute, wenn ich eine neue Anwendung auf fb-Entwicklern hinzufügen, bekomme ich es mit API 2.4.

Das Problem: Jetzt bekomme ich null Email von fb ( loginInfo.email = null ).

Natürlich habe ich überprüft, dass die Benutzer-E-Mail im öffentlichen Status auf fb-Profil ist,

und ich ging über das loginInfo Objekt, fand aber keine andere E-Mail-Adresse.

und ich google das, aber habe keine Antwort gefunden.

bitte jede Hilfe .. Ich bin irgendwie verloren ..

Vielen Dank,

Mein ursprünglicher Code (der auf 2.3 api funktioniert hat):

In der AccountController.cs:

//
// GET: /Account/ExternalLoginCallback
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
    if (loginInfo == null)
    {
        return RedirectToAction("Login");
    }
    //A way to get fb details about the log-in user: 
    //var firstNameClaim = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:first_name");  <--worked only on 2.3
    //var firstNameClaim = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:name"); <--works on 2.4 api

    // Sign in the user with this external login provider if the user already has a login
    var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);
    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl);
        case SignInStatus.LockedOut:
            return View("Lockout");
        case SignInStatus.RequiresVerification:
            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false });
        case SignInStatus.Failure:
        default:
            // If the user does not have an account, then prompt the user to create an account
            ViewBag.ReturnUrl = returnUrl;
            ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
            return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });  //<---DOESN'T WORK. loginInfo.Email IS NULL
    }
}

In der Startup.Auth.cs:

    Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions fbOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions()
    {
        AppId = System.Configuration.ConfigurationManager.AppSettings.Get("FacebookAppId"),
        AppSecret = System.Configuration.ConfigurationManager.AppSettings.Get("FacebookAppSecret"),
    };
    fbOptions.Scope.Add("email");
    fbOptions.Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider()
    {
        OnAuthenticated = (context) =>
        {
            context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));
            foreach (var claim in context.User)
            {
                var claimType = string.Format("urn:facebook:{0}", claim.Key);
                string claimValue = claim.Value.ToString();
                if (!context.Identity.HasClaim(claimType, claimValue))
                    context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Facebook"));

            }
            return System.Threading.Tasks.Task.FromResult(0);
        }
    };
    fbOptions.SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie;
    app.UseFacebookAuthentication(fbOptions);



Ich möchte nur die Antwort von Mike auf diese Zeile hinzufügen

facebookOptions.Scope.Add("email");

muss nachher noch hinzugefügt werden

var facebookOptions = new FacebookAuthenticationOptions()
{
    AppId = "*",
    AppSecret = "*",
    BackchannelHttpHandler = new FacebookBackChannelHandler(),
    UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email,first_name,last_name,location"
}

Und wenn Sie Ihren Facebook-Account bereits ohne E-Mail-Erlaubnis auf Ihrer Entwickler-Website registriert haben. Nachdem Sie den Code geändert und es erneut versucht haben, erhalten Sie die E-Mail immer noch nicht, da die E-Mail-Berechtigung für Ihre Dev-Website nicht erteilt wurde. Ich gehe zu https://www.facebook.com/settings?tab=applications , entferne meine Facebook-App und führe den Vorgang erneut durch.




Lesen Sie das changelog , das ist von Entwurf. Sie müssen explizit die Felder und Kanten anfordern, die in der Antwort neu abgestimmt werden sollen:

Deklarative Felder Um die Leistung in mobilen Netzwerken zu verbessern, müssen Knoten und Kanten in Version 2.4 explizit die Felder anfordern, die Sie für Ihre GET Anforderungen benötigen. Beispiel: GET /v2.4/me/feed enthält GET /v2.4/me/feed keine Likes und Kommentare mehr, aber GET /v2.4/me/feed?fields=comments,likes gibt die Daten zurück. Weitere Informationen finden Sie in der docs zum Anfordern bestimmter Felder.






Related