Facebook v2.4与OAuth2停止工作,只获得名称和身份

时间:2015-08-09 23:47:13

标签: facebook oauth-2.0 owin

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

提前致谢。

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

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

但仍然没有工作......

更新2:我发现this post可以收到电子邮件,但是我必须安装额外的Facebook SDK for .NET,我希望避免...还会找到显示的this post如何提取像生日这样的更多值(在facebook API v4.3中我必须发送生日而不是user_birthday) dynamic myInfo = fb.Get(" / me?fields = email,birthday"); 我还在寻找通过标准Oauth2方法发送范围值的方法......

更新3: 我设法使用Facebook .NET SDK获取更多信息 - https://stackoverflow.com/a/31933544/3187389 但是仍然希望不使用标准的Oauth2(和Owin)而不使用Facebook .NET SDK ...

2 个答案:

答案 0 :(得分:1)

Facebook在2.4中做了一些改变。现在,默认情况下,您只能获得这两个字段,如果您需要任何其他字段,则必须明确请求它们:

  

声明字段   要尝试提高移动网络的性能,v2.4中的节点和边缘要求您明确请求GET请求所需的字段。例如,GET /v2.4/me/feed默认不再包含喜欢和评论,但GET /v2.4/me/feed?fields=comments,likes将返回数据。有关详细信息,请参阅有关如何请求特定字段的文档。

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

不幸的是,我不确定如何为您正在使用的图书馆翻译它。

答案 1 :(得分:1)

解决了!终于......并使用新的facebook API 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(添加到代码段)