【问题标题】:Facebook with DotNetOpenAuth 4.1.0.12182Facebook 与 DotNetOpenAuth 4.1.0.12182
【发布时间】:2012-07-19 20:57:45
【问题描述】:

我正在尝试使用 DotNetOpenAuth 4.1.0.12182

为 Facebook 和 Windows LiveId 创建用户登录名

但是,下载中的示例使用了当前版本中不存在的 DotNetOpenAuth.ApplicationBlockDotNetOpenAuth.ApplicationBlock.Facebook

取而代之的是 DotNetOpenAuth.AspNet.Clients 命名空间,其中包括 FacebookClientWindowsLiveClient - 但是我找不到任何如何使用它们的示例。

是否存在任何示例或文档?

【问题讨论】:

    标签: facebook oauth-2.0 dotnetopenauth


    【解决方案1】:

    通过创建派生自 DotNetOpenAuth.OAuth2.WebServerClient 的 FacebookAuthClient,我已经能够让 DNOA 版本 4.1.0.12182、.Net 3.5 和 Facebook 相互协作。我发现的一个小问题是,如果您使用基于 cookie 的会话,那么您必须在使用 OAuth 功能之前访问该会话。据我所知,这是因为 DNOA 使用会话 ID 作为状态参数,如果会话从未被访问过,它可以在请求之间更改。当响应从 Facebook 返回时,这将导致状态参数不匹配错误。

    FacebookAuthClient:

    public class FacebookAuthClient : DotNetOpenAuth.OAuth2.WebServerClient
    {
        private static readonly DotNetOpenAuth.OAuth2.AuthorizationServerDescription Description = new DotNetOpenAuth.OAuth2.AuthorizationServerDescription
        {
            TokenEndpoint = new Uri("https://graph.facebook.com/oauth/access_token"),
            AuthorzationEndpoint = new Uri("https://graph.facebook.com/oauth/authorize")    
        };
    
        public static readonly string [] ScopeNeeded = { "publish_stream" };
    
        public FacebookAuthClient()
           : base(Description)
    
        {
        }
    }
    

    Facebook.aspx.cs:

    public partial class FacebookPage : System.Web.UI.Page
    {
        private FacebookAuthClient _client = new FacebookAuthClient
        {
            ClientIdentifier = ConfigurationManager.AppSettings["FBClientId"], //The FB app's Id
            ClientCredentialApplicator = DotNetOpenAuth.OAuth2.ClientCredentialApplicator.PostParameter(ConfigurationManager.AppSettings["FBClientSecret"]) // The FB app's secret
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            DotNetOpenAuth.OAuth2.IAuthorizationState auth = _client.ProcessUserAuthorization();
            if (_auth == null)
            {
                // Kick off authorization request with the required scope info
                client.RequestUserAuthorization(FacebookAuthClient.ScopeNeeded);
            }
        }
    }
    

    这只是一个测试应用程序,因此没有错误处理,但它似乎可以工作。

    编辑 我对所有这些都使用了 DotNetOpenAuth(unified) NuGet 包。

    编辑 为创建 ClientCredentialApplicator 添加了缺少的 .PostParameter 调用。

    【讨论】:

    • 感谢乔希的分享——我只是希望它没有涉及到如此多的赏金来让这个曝光! (不针对您或任何人)
    • DotNetOpenAuth.OAuth2.ClientCredentialApplicator 说它是一种类型,但我可以从中使用.NetworkCredential。但后来我收到错误 400 错误请求。
    • BrunoLM - 感谢您指出我已将代码更新为 DotNetOpenAuth.OAuth2.ClientCredentialApplicator.PostParameter。注意缺少的 PostParameter 部分
    【解决方案2】:

    您需要使用 DNOA 的 ctp 3.5 版。版本 4+ 已与后来 Facebook 使用的 OAuth 2 草案一起使用。

    您可以在所有者 GitHub 上找到它: https://github.com/AArnott/dotnetopenid

    【讨论】:

    • 如果是这样,那为什么库中会存在FacebookClient这个类呢?
    • 我与 DNOA 的创建者就这个问题进行了相当长的讨论,他指出这是因为当 Facebook 决定更新到最新草案时,它可能会在稍后工作.在那之前,除了自己处理请求之外,没有其他解决方案。
    • 如果 DNOA 上有关于这个(其他)问题的突出常见问题解答,那将非常有用。 DNOA 在简化 OpenID/OAuth 的使用方面大有帮助 - 但此类问题会带来新的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多