asp.net-mvc - 在 OWIN 登录时检索用户 Facebook 电子邮件

标签 asp.net-mvc facebook-graph-api asp.net-mvc-5 asp.net-identity owin

这个问题在这里已经有了答案:





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

(6 个回答)


5年前关闭。




我正在学习如何使用 VS 2015 中的默认 MVC 模板使用 OWIN 外部身份验证。我启用了 Facebook 身份验证并添加了范围“电子邮件”,期望在用户通过身份验证后 Facebook 返回用户的电子邮件(根据 this) .尽管如此,context.User JSON 对象中没有电子邮件,context.Email 也为空。

这是Startup.Auth.cs中的相关代码

var facebookOptions = new FacebookAuthenticationOptions
        {
            AppId = "XXXXXX",
            AppSecret = "XXXXXX",
            Provider = new FacebookAuthenticationProvider
            {
                OnAuthenticated =  context =>
                {
                    // Retrieve the OAuth access token to store for subsequent API calls
                    var accessToken = context.AccessToken;

                    // Retrieve the username
                    var facebookUserName = context.UserName;

                    // WHY IS IT EMPTY?
                    var facebookEmail = context.Email;

                    // You can even retrieve the full JSON-serialized user
                    var serializedUser = context.User;

                    return Task.FromResult(0);
                }
            }
        };

        facebookOptions.Scope.Add("email");

        app.UseFacebookAuthentication(facebookOptions);

任何想法缺少什么?为什么不返回 Facebook 电子邮件地址?

最佳答案

事实证明,在 Facebook API v 2.4 中发生了重大变化,您必须指定要检索的字段。图形请求曾经是:

https://graph.facebook.com/v2.3/me?access_token=XXXXX

但由于 FB API v2.4 的性能原因,您还必须指定要在范围内检索的文件:
https://graph.facebook.com/v2.4/me?fields=id,name,email&access_token=XXXXX

默认情况下,Microsoft FB 客户端实现将 access_token 作为“?access_token”附加到查询字符串,这会导致请求中断(额外的问号):

https://graph.facebook.com/v2.4/me?fields=id,name,email?access_token=XXXXX

因此,为了解决这个问题,我们需要使用自定义 BackchannelHttpHandler。首先,我们创建端点类:
    public class FacebookBackChannelHandler : HttpClientHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (!request.RequestUri.AbsolutePath.Contains("/oauth"))
            {
                request.RequestUri = new Uri(request.RequestUri.AbsoluteUri.Replace("?access_token", "&access_token"));
            }

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

然后我们在 facebook auth 选项中提供它,并明确指定 UserInformationEndpoint:
var facebookAuthOptions = new FacebookAuthenticationOptions
        {
            AppId = ConfigurationManager.AppSettings["FacebookAppId"],
            AppSecret = ConfigurationManager.AppSettings["FacebookAppSecret"],
            BackchannelHttpHandler = new FacebookBackChannelHandler(),
            UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email",
            Scope = { "email" }
            <.....>
        };

发件人:https://stackoverflow.com/a/32636149/3130094

关于asp.net-mvc - 在 OWIN 登录时检索用户 Facebook 电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34400013/

相关文章:

javascript - 如何将复选框的值从 JavaScript/ View 传递到 MVC 中的 Controller ?

javascript - 您可以从 ASP.NET MVC 5 中的 Controller 深层链接到页面吗?

javascript - MVC 两个列表框双击时从第一个添加到第二个

asp.net - MVC 身份 2.2.1 - 主键 (Guid) 作为 UniqueIdentifier 而不是 nVarChar(128)

asp.net-mvc - 当它被称为 DocumentationController 时,MVC Controller 给我一个 403 禁止错误和默认路由

c# - ASP.NET MVC5 路由到 View 上的 div

javascript - Facebook - 获取带有/不带有访问 token 的页面 ID

ios - 如何将 og.likes 操作类型与产品对象类型一起使用?

facebook - 我可以在 Facebook Graph API 中查询可选字段吗?

c# - 仅在 MVC 编辑模板中编辑值