facebook - net - mvc authentication
Facebook v2.4 con OAuth2 dejó de funcionar y solo obtuvo el nombre y la identificación (2)
Facebook hizo algunos cambios en 2.4. Ahora solo obtiene esos dos campos de forma predeterminada, si desea otros campos, debe solicitarlos explícitamente:
Campos declarativos Para tratar de mejorar el rendimiento en redes móviles, Nodos y Bordes en v2.4 requiere que solicite explícitamente los campos que necesita para sus solicitudes GET. Por ejemplo, GET /v2.4/me/feed ya no incluye me gusta y comentarios de manera predeterminada, pero GET /v2.4/me/feed?fields=comments,likes devolverá los datos. Para obtener más detalles, consulte los documentos sobre cómo solicitar campos específicos.
https://developers.facebook.com/docs/apps/changelog#v2_4_changes
Lamentablemente, no estoy seguro de cómo traducir eso para la Biblioteca que estás usando.
Algo cambió de Facebook APIs v2.3 a v2.4 - después de usar 2.4 solo puedo obtener el nombre y la identificación,
Vi algunas publicaciones hablando de agregar un "? Fields = scopes ..." pero es un verdadero misterio para mí, estoy tratando de entender cómo enviar estos campos de alcance ...
Aquí está mi código:
var facebookAuthOptions = new FacebookAuthenticationOptions();
facebookAuthOptions.AppId = facebookAuthAppId;
facebookAuthOptions.AppSecret = facebookAuthAppSecret;
facebookAuthOptions.Scope.Add("email");
facebookAuthOptions.Scope.Add("user_birthday");
facebookAuthOptions.Scope.Add("public_profile");
facebookAuthOptions.Provider = new FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
// https://stackoverflow.com/questions/25966530/asp-net-mvc-5-1-c-sharp-owin-facebook-authentication-or-login-ask-for-birthday/25967936#25967936
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);
var claimValue = claim.Value.ToString();
if (!context.Identity.HasClaim(claimType, claimValue))
context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Facebook"));
}
return Task.FromResult(0);
}
};
app.UseFacebookAuthentication(facebookAuthOptions);
Gracias por adelantado.
ACTUALIZACIÓN 1: Intenté inyectar los campos de alcance de esta manera:
facebookAuthOptions.UserInformationEndpoint += "?fields=email,user_birthday,first_name,last_name";
Pero aún no funciona ...
ACTUALIZACIÓN 2: Encontré esta publicación que hace posible obtener el correo electrónico, pero tengo que instalar SDK de Facebook adicional para .NET que prefiero evitar ... también encontré esta publicación que muestra cómo extraer más valores como cumpleaños (en Facebook API v4.3 tuve que enviar mi cumpleaños y no user_birthday) dynamic myInfo = fb.Get ("/ me? fields = email, birthday"); Todavía estoy buscando una forma de enviar los valores del alcance a través de los métodos estándar de Oauth2 ...
ACTUALIZACIÓN 3: Logré obtener más información usando Facebook .NET SDK - https://stackoverflow.com/a/31933544/3187389 Pero aún prefiero no poder hacer eso con el estándar Oauth2 (y Owin) sin usar Facebook. NET SDK ...
SOLUCIONADO finalmente ... y trabajando con las nuevas API de Facebook v2.4
Entonces quizás pueda salvar a otra persona por 6 horas :-)
Necesitarás instalar Facebook SDK para .NET
Así es como lo arreglé:
// Use Facebook SDK for .NET to get more specific data (https://github.com/facebook-csharp-sdk/facebook-csharp-sdk)
var identity = AuthenticationManager.GetExternalIdentity(DefaultAuthenticationTypes.ExternalCookie);
var facebookAccessToken = identity.FindFirstValue("FacebookAccessToken");
var fb = new FacebookClient(facebookAccessToken);
dynamic facebookInfo = fb.Get("/me?appsecret_proof=YourFacebookAppSecretProof&fields=email,birthday,gender");
signInInfo.Email = facebookInfo.email;
ACTUALIZACIÓN: ahora también se requiere pasar el appsecret_proof (agregado al fragmento)