我似乎无法避免使用 webmatrix beta 2 中引入的 oauthwebsecurity 在 facebook 和 gmail 中请求和检索额外数据(例如个人资料图片和电子邮件)的可能性。默认情况下,gmail 和 yahoo 会返回除 facebook 之外的电子邮件。它们都不会返回用户的图像。请问,我该如何解决这个问题?
1 回答
首先,如果您使用的是 Visual Studio 2012,那么在构建网站时会内置参考架构来处理 Facebook OAuth。它广泛建议通过 Nuget 添加 Facebook C# SDK 以启用对 FacebookClient 的调用。
了解第一次调用 Facebook Oauth 以获取反馈至关重要,它只会返回以下变量:
- id(可以是邮箱或手机)
- 名称(用户的全名)
- 链接(链接到他们在 Facebook 上的个人资料页面)
- 性别(男性或女性..这里的选择很少)
- 访问令牌
获得访问令牌后,您可以使用它来调用其他变量。要查看您可以使用 Facebook 客户端访问的内容,请查看https://developers.facebook.com/docs/reference/api/user/ 以获取各种变量的完整列表。(新手警告:我还没有弄清楚如何调用所有这些,但重要的部分很容易。)
Scott MitzFacken 提供了一篇关于在 MVC 网站中使用 OAuth 提供程序的优秀教程,他将带您完成每个步骤,除了最重要的一步:使用访问令牌取出 Extradata,然后将其放入您的数据库。按照他的教程进行操作,直到您将此代码添加到 ExternalLoginCallback 方法中:
if (result.ExtraData.Keys.Contains("accesstoken"))
{
Session["facebooktoken"] = result.ExtraData["accesstoken"];
}
好的,您已经以正确的方法获得了访问令牌。现在从 Facebook 获取数据并进入您的应用程序。在检查用户是否已经存在之后,我修改了 ExternalLoginConfirmation 方法:
// Check if user already exists
if (user == null) {
var client = new Facebook.FacebookClient(Session["facebooktoken"].ToString());
dynamic response = client.Get("me", new {
fields = "first_name, last_name, email"
});
model.FirstName = response["first_name"];
model.LastName = response["last_name"];
model.EmailAddy = response["email"];
// Insert name into the profile table
db.UserProfiles.Add(new UserProfile {
UserName = model.UserName, FullName = model.FullName, Gender = model.Gender, FirstName = model.FirstName, LastName = model.LastName, EmailAddy = model.EmailAddy
});
db.SaveChanges();
- 这假设您已将 Facebook C# SDK 应用于您的项目。
- Facebook 字段是在一组“”中请求的,用逗号分隔。
- 在我的示例中,model.XXX 指的是用户配置文件字段。
- 然后我将用户配置文件字段转换为 response["XXX"] 字符串。
- 由于 Facebook Oauth 客户端,保存用户配置文件记录时,还会保存其他字段。
我不确定你是否还需要这个答案......希望不是。对于像我这样一整天都在努力解决这个问题的菜鸟,我希望这个答案能对这个问题有所了解
干杯,祝你好运!