从 ASP.NET MVC 5 中的 Facebook v2.4 API 访问 OAuth ExternalLoginCallback 中的电子邮件地址 [重复]
Posted
技术标签:
【中文标题】从 ASP.NET MVC 5 中的 Facebook v2.4 API 访问 OAuth ExternalLoginCallback 中的电子邮件地址 [重复]【英文标题】:Access email address in the OAuth ExternalLoginCallback from Facebook v2.4 API in ASP.NET MVC 5 [duplicate] 【发布时间】:2015-10-21 06:19:18 【问题描述】:使用 v2.3 的 Facebook API,如果设置了以下内容,用户的电子邮件地址将在回调时返回到 ExternalLoginCallback
;
app.UseFacebookAuthentication(new FacebookAuthenticationOptions
AppId = "XXX",
AppSecret = "XXX",
Scope = "email"
);
但是,任何只能针对 v2.4(7 月 8 日发布)的应用程序不再将电子邮件地址返回到 ExternalLoginCallback
。
我认为这可能与here 列出的 v2.4 更改有关;
声明性字段
为了尝试提高移动网络的性能, v2.4 中的节点和边缘要求您明确请求 GET 请求所需的字段。比如
GET /v2.4/me/feed
默认不再包含likes和cmets,而是GET /v2.4/me/feed?fields=comments,likes
将返回数据。更多 有关如何请求特定字段的详细信息,请参阅文档。
我现在如何访问此电子邮件地址?
【问题讨论】:
【参考方案1】:为了解决这个问题,我必须从 nuget 安装 Facebook SDK for .NET 并单独查询电子邮件地址。
在ExternalLoginCallback
方法中,我添加了一个条件来填充来自 Facebook Graph API 的电子邮件地址;
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
return RedirectToAction("Login");
// added the following lines
if (loginInfo.Login.LoginProvider == "Facebook")
var identity = AuthenticationManager.GetExternalIdentity(DefaultAuthenticationTypes.ExternalCookie);
var access_token = identity.FindFirstValue("FacebookAccessToken");
var fb = new FacebookClient(access_token);
dynamic myInfo = fb.Get("/me?fields=email"); // specify the email field
loginInfo.Email = myInfo.email;
为了得到FacebookAccessToken
,我扩展了ConfigureAuth
;
app.UseFacebookAuthentication(new FacebookAuthenticationOptions
AppId = "XXX",
AppSecret = "XXX",
Scope = "email" ,
Provider = new FacebookAuthenticationProvider
OnAuthenticated = context =>
context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));
return Task.FromResult(true);
);
【讨论】:
嗨,您使用的那个 Facebook 库 nuget 的名称是什么?我愿意知道。谢谢。 太棒了!有效。现在我正在尝试获取其他值 user_birthday - 知道该怎么做吗? @Yovav 查看the api。它说您必须列出您想要返回的所有字段,所以我想如果您将请求更改为/me?fields=email,birthday
,您会在回复中收到电子邮件和生日。
谢谢@StaffordWilliams。我在网上搜索找到这个!
我可以确认这在 2017 年仍然有效,因为我是今年第一个发表评论的人 :))) 也使用所有(几乎)最新的东西 - 与 2015 社区相比,Asp.Net 4.6.1 【参考方案2】:
在 MVC 6 (Asp.net Core 1.0) 中,通过在 startup.cs 中配置 FacebookAuthentication,如下所示:
app.UseFacebookAuthentication(options =>
options.AppId = Configuration["Authentication:Facebook:AppId"];
options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
options.Scope.Add("email");
options.UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email,first_name,last_name";
);
我可以收到电子邮件。即:
var info = await _signInManager.GetExternalLoginInfoAsync();
var email = info.ExternalPrincipal.FindFirstValue(ClaimTypes.Email);
【讨论】:
你的例子是asp.net-mvc-6。此外,我发现对于asp.net-mvc-6,我不必将email
添加到范围内,默认情况下它是可用的。
对此我很抱歉。 ASP.NET 5/Core 1 和 MVC 6 仍然让我一团糟。
实际上我发现这个解决方案也适用于 MVC 5 - 特别是添加上面的 UserInformationEndpoint 是让电子邮件被填充的关键
我正在使用 mvc5,我想在 fb auth 之后获取用户名。你能给我一些方向吗?谢谢
这适用于 Asp 2.2 吗?以上是关于从 ASP.NET MVC 5 中的 Facebook v2.4 API 访问 OAuth ExternalLoginCallback 中的电子邮件地址 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
从 ASP.NET MVC 5 中的 Facebook v2.4 API 访问 OAuth ExternalLoginCallback 中的电子邮件地址 [重复]
如何在 asp.net mvc 5 中返回模型和参数中的另一个动作?
VS 2015 ASP.NET 4 MVC 5 中的打字稿 - 设置和选择的工作组合是啥?