这个问题在这里已经有了答案:
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/