关于.net:C#中的OAuth作为客户端

OAuth in C# as a client

我已获得6位信息来访问网站上的某些数据:

  • 网站Json Url(例如:http://somesite.com/items/list.json)
  • OAuth授权网址(例如:http://somesite.com/oauth/authorization)
  • OAuth请求网址(例如:http://somesite.com/oauth/request)
  • OAuth访问网址(例如:http://somesite.com/oauth/access)
  • 客户端密钥(例如:12345678)
  • 客户机密(例如:abcdefghijklmnop)
  • 现在,我研究了DotNetOpenAuth和OAuth.NET库,虽然我确定它们能够满足我的需要,但我只是想不通如何使用这种方式。

    有人可以在任何一个库中(或可能同样起作用的任何其他方式)发布一些有关如何使用Url(第1点)的示例代码吗?

    谢谢!


    一个月前我也刚开始使用OAuth,所有这些库也让我感到困惑。我意识到这些库的一件事是它们非常复杂(如您所知)。另一个让我感到困难的是,没有太多示例(在我的情况下更糟糕,因为我试图实现提供者而不是客户)。

    最初,我想使用最新的OAuth 2.0,但是唯一实现它的.NET库是DotNetOpenAuth。它可能是目前最完整的.NET OAuth库之一,但对我来说却花了很长时间(由于不了解WCF,MVC等)。此后,我已降级为OAuth 1.0a,因为我发现了DevDefined OAuth的这些示例。我不了解您,但是我发现从示例中学习变得容易。

    您似乎只想实现一个Client,因此请确保查看Consumer示例。尝试编译示例,并忽略提供程序示例,因为您不需要它们,这会使您更加困惑。耐心点。如果您仍然感到困惑,最好查看一些为其他语言编写的库,因为它们可能更易于理解文档。


    好吧,我知道您的最新帖子是几个月前的,但是如果您仍在从事此工作(或者对于像我一样希望看到该问题答案的人),以下是有关NullReferenceException的信息您在创建OAuth请求时遇到了问题:

    空引用来自用于解析依赖关系的IServiceLocator。如果未将一个显式传递给构造函数,它将使用Microsoft.Practices.ServiceLocation命名空间中的静态属性ServiceLocator.Current

    这是使用静态方法和全局状态的众多陷阱之一,是您向API使用者隐藏了此类问题。因此,如果您未指定默认服务定位符,则会返回null,从而导致NullReferenceException

    因此,为了解决此问题,我连接了IServiceLocator的实现,该实现使用StructureMap(许多IoC容器之一)作为容器。最后,您将需要注册两个接口的实例:ISigningProviderINonceProvider。幸运的是,OAuth.Net.Components程序集中存在几种标准实现,例如GuidNonceProvider和HmacSha1SigningProvider。

    生成的代码如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    var container = new Container();

    container.Configure(a => a.For<INonceProvider>().Use<GuidNonceProvider>());
    container.Configure(a => a.For<ISigningProvider>()
                              .Use<HmacSha1SigningProvider>()
                              .Named("signing.provider:HMAC-SHA1"));

    var locator = new StructureMapAdapter(container);
    ServiceLocator.SetLocatorProvider(delegate { return locator; });

    我知道这不是您最初提出的问题的最终解决方案(我仍在努力使它自己解决),但我希望它可以使您进一步走下去。而且,如果您早已完全放弃了此实现,那么,无论如何,还是很高兴编写代码!


    对于OAuth 2.0:

    我了解到,最简单的方法是将身份验证页面放在HTML窗口中,然后捕获返回的access_token。然后,您可以在客户端Web浏览器中使用该功能。

    例如,在MonoTouch中为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    //
    // Present the authentication page to the user
    //
    var authUrl ="http://www.example.com/authenticate";
    _borwser.LoadRequest (new NSUrlRequest (new NSUrl (authUrl)));

    //
    // The user logged in an we have gotten an access_token
    //
    void Success(string access_token) {

        _web.RemoveFromSuperview();

        var url ="http://www.example.com/data?access_token=" + access_token;

        // FETCH the URL as needed
    }

    //
    // Watch for the login
    //
    class Del : UIWebViewDelegate
    {
        public override void LoadingFinished (UIWebView webView)
        {
            try {
                var url = webView.Request.Url.AbsoluteString;
                var ci = url.LastIndexOf ("access_token=");
                if (ci > 0) {
                    var code = url.Substring (ci +"access_token=".Length);
                    _ui.Success (code);
                }
            } catch (Exception error) {
                Log.Error (error);
            }
        }
    }