繁体   English   中英

在asp net中从facebook获取用户电子邮件

[英]Get user email from facebook in asp net

我正在尝试从Facebook获取用户名和用户电子邮件。 我阅读了很多关于这个主题的信息,这是我的最终代码,仅在我的facebook app管理员帐户上有效:

public partial class Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {

        /*Other external login options*/

         var FacebookOptions = new FacebookAuthenticationOptions()
                {
                    AppId = "My App Id",
                    AppSecret = "My App Secret",
                    SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie,
                    BackchannelHttpHandler = new FacebookBackChannelHandler(),
                    UserInformationEndpoint = "https://graph.facebook.com/v2.7/me?fields=id,name,email"
                };


    }
}
public class FacebookBackChannelHandler : HttpClientHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.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);
    }
}
public class AccountController : Controller
{
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
        /*my sign in code that works on my facebook app admin account*/
    }  
}    

在每个帐号我得到loginInfo.Email等于null

developers.facebook.com我有:

批准的项目

当有人点击“使用Facebook登录”时,他会收到以下消息:

第一个Facebook登录页面

如果我点击“查看您提供的信息”,我会得到:

查看您提供的信息

我错过了什么? 为什么不起作用?

终于找到了答案! 所有需要做的就是将Scope = { "email" }FacebookOptions ,这就解决了这个问题!

我的代码现在:

public partial class Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {

        /*Other external login options*/

         var FacebookOptions = new FacebookAuthenticationOptions()
                {
                    AppId = "My App Id",
                    AppSecret = "My App Secret",
                    SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie,
                    BackchannelHttpHandler = new FacebookBackChannelHandler(),
                    Scope = { "email" },
                    UserInformationEndpoint = "https://graph.facebook.com/v2.7/me?fields=id,name,email"
                };
    }
}

其余代码保持不变。 如果此问题返回,我只为案例添加了错误页面:

public class AccountController : Controller
{
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
        if(loginInfo.Email == null)
        {
             return RedirectToAction("FacebookError", "Account");
        }
        /*my sign in code*/
    }  
}   

Facebook让人们可以完全控制他们授予应用的权限。 该控件超出了他们看到登录对话框的程度。 他们可以选择在登录过程中不授予某些权限。 他们还可以随时撤消其Facebook隐私设置中的权限。 在尝试执行API调用之前,应用应检查权限的有效性。 例如,在尝试发布Open Graph故事之前,仍然会检查该电子邮件操作是否已被授予。 facebook提供了一个图形API端点来检索已授予权限的列表:

GET /{user-id}/permissions

必须使用用户访问令牌或您的应用访问令牌进行调用。 该调用将返回一个JSON字符串,其中包含已授予应用程序的权限名称及其状态:

{
  "data": [
    {
      "permission": "public_profile",
      "status": "granted"
    },
    {
      "permission": "publish_actions",
      "status": "granted"
    },
    {
      "permission": "user_friends",
      "status": "declined"
    }
  ]
}

通过使用它,您可以检测是否可以获取所需的信息。 希望这可以帮助。

参考: https//developers.facebook.com/docs/facebook-login/permissions/requesting-and-revoking

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM