带有 OAuth2 的 Facebook v2.4 停止工作,只获取名称和 ID

Facebook v2.4 with OAuth2 stopped working and only getting name and id

从 facebook API v2.3 到 v2.4 发生了一些变化 - 使用 2.4 后我只能获取名称和 ID,

我看到一些帖子谈论添加“?fields=scopes...”,但这对我来说是一个真正的谜 - 我正在尝试了解如何发送这些范围字段...

这是我的代码:

        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) =>
            {
                // 
                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);

提前致谢。

更新 1:我尝试像这样注入范围字段:

facebookAuthOptions.UserInformationEndpoint += "?fields=email,user_birthday,first_name,last_name";

但还是不行...

更新 2:我发现 that makes it possible to get the email, but I have to install additional Facebook SDK for .NET which I prefer to avoid... also found this post 展示了如何提取更多值,例如生日(在 facebook APIs v4.3 中我必须发送生日而不是 user_birthday) 动态 myInfo = fb.Get("/me?fields=email,birthday"); 我仍在寻找一种通过标准 Oauth2 方法发送范围值的方法...

更新 3: 我设法使用 Facebook .NET SDK 获取了更多信息 - 但仍然希望在不使用 Facebook .NET SDK 的情况下无法使用标准 Oauth2(和 Owin)做到这一点...

Facebook 在 2.4 中进行了一些更改。你现在默认只得到这两个字段,如果你想要任何其他字段,你必须明确请求它们:

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.

https://developers.facebook.com/docs/apps/changelog#v2_4_changes

很遗憾,我不确定如何为您正在使用的库翻译它。

已解决!终于......并使用新的 facebook APIs v2.4

所以也许我可以为别人节省 6 个小时:-)

您需要为 .NET 安装 Facebook SDK

我是这样修复的:

// 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;

更新: 现在还需要传入 appsecret_proof(添加到代码段)