从 asp net 中的 facebook 获取用户电子邮件
Get user email from facebook in asp net
我正在尝试从 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
。
当有人点击 "Login with Facebook" 时,他会收到此消息:
如果我点击 "Review the info you provide" 我得到:
我错过了什么?为什么不起作用?
Facebook 让人们可以完全控制他们授予应用程序的权限。该控件超出了他们看到登录对话框的范围。他们可以选择在登录过程中不授予某些权限。他们还可以随时撤销其 Facebook 隐私设置中的权限。应用程序应在尝试执行需要权限的 API 调用之前检查权限的有效性。例如,在尝试发布 Open Graph 故事之前检查电子邮件操作是否仍被授予。
facebook 提供了一个图形 API 端点来检索授予的权限列表:
GET /{user-id}/permissions
必须使用用户访问令牌或您的应用访问令牌进行调用。该调用将 return 一个 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
终于找到答案了!只需要将 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"
};
}
}
其余代码保持不变。如果这个问题 returns:
我只添加了错误页面
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 应用程序管理员帐户上运行:
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
。
当有人点击 "Login with Facebook" 时,他会收到此消息:
如果我点击 "Review the info you provide" 我得到:
我错过了什么?为什么不起作用?
Facebook 让人们可以完全控制他们授予应用程序的权限。该控件超出了他们看到登录对话框的范围。他们可以选择在登录过程中不授予某些权限。他们还可以随时撤销其 Facebook 隐私设置中的权限。应用程序应在尝试执行需要权限的 API 调用之前检查权限的有效性。例如,在尝试发布 Open Graph 故事之前检查电子邮件操作是否仍被授予。 facebook 提供了一个图形 API 端点来检索授予的权限列表:
GET /{user-id}/permissions
必须使用用户访问令牌或您的应用访问令牌进行调用。该调用将 return 一个 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
终于找到答案了!只需要将 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"
};
}
}
其余代码保持不变。如果这个问题 returns:
我只添加了错误页面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*/
}
}