【问题标题】:Adding Facebook Permissions in OpenAuth.RequestAuthentication在 OpenAuth.RequestAuthentication 中添加 Facebook 权限
【发布时间】:2013-01-10 05:01:16
【问题描述】:

我在 Visual Studio 中使用 Asp.Net 4.5 为我的网站实现 Facebook 登录。特别是,我在.Net 框架中使用Microsoft.AspNet.Membership.OpenAuth 和相关类。

我可以毫无问题地从 Facebook 检索基本信息;但是,我需要请求权限以获取用户的更多 Facebook 信息。

为了清楚起见,OpenAuthProviders.asxc.cs 中的以下方法将用户引导到 Facebook 并弹出 Facebook 对话框询问用户权限:

OpenAuth.RequestAuthentication(provider, redirectUrl);

此函数重定向到以下格式的 URL:

https://www.facebook.com/dialog/oauth?client_id=xxx&redirect_uri=xxx&__provider__=facebook&__sid__=xxx&scope=email

我的问题是,目前 URL 中的范围始终是 email。我们如何向范围添加更多内容,例如用户生日,用户图片网址,通过OpenAuth.RequestAuthentication函数?

如果我必须编写一个新的更深入的函数来直接与 Facebook 对话来实现这一点,那么我为什么首先使用这个 OpenAuth 类似乎有点违反直觉。

任何建议表示赞赏!

【问题讨论】:

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


    【解决方案1】:

    首先,如果您使用的是 Visual Studio 2012,那么在构建您的网站时会内置参考架构来处理 Facebook OAuth。它广泛建议通过 Nuget 添加 Facebook C# SDK 以启用对 FacebookClient 的调用。

    其次,用户名并不总是电子邮件地址。 Facebook 允许用户使用他们的手机号码创建一个帐户,而无需电子邮件地址。因此,不要依赖此字段来始终为您提供电子邮件地址。相反,您可以调用 Facebook OAuth 客户端为您获取此信息。

    了解第一次调用 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();
    
    1. 这假设您已将 Facebook C# SDK 应用于您的项目。
    2. Facebook 字段是在一组用逗号分隔的“”中请求的。
    3. 在我的示例中,model.XXX 指的是用户配置文件字段。
    4. 然后我将用户配置文件字段转换为 response["XXX"] 字符串。
    5. 在保存用户配置文件记录时,其他字段也会被保存,这要归功于 Facebook Oauth 客户端。

    我不确定您是否还需要这个答案……希望不会。对于像我这样一整天都在努力解决这个问题的菜鸟,我希望这个答案能对这个主题有所启发

    干杯,祝你好运!

    [标签:c#] [标签:facebook] [标签:dotnetopenoauth]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多