【问题标题】:Get user email from facebook in asp net在asp net中从facebook获取用户电子邮件
【发布时间】:2017-01-08 10:24:13
【问题描述】:

我正在尝试从 facebook 获取用户名和用户电子邮件。我阅读了很多关于这个主题的信息,这是我的最终代码,由于某种原因只能在我的 facebook 应用程序管理员帐户上工作:

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 登录”时,他会收到以下消息:

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

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

【问题讨论】:

    标签: c# asp.net oauth facebook-oauth


    【解决方案1】:

    终于找到答案了!只需将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*/
        }  
    }   
    

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

      • 感谢您的回答。这有助于我理解问题肯定出在我的请求中,而不是用户权限。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多