繁体   English   中英

C#中的OAuth作为客户端

[英]OAuth in C# as a client

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

  1. 网站Json Url(例如: http//somesite.com/items/list.json
  2. OAuth授权URL(例如: http//somesite.com/oauth/authorization
  3. OAuth请求网址(例如: http//somesite.com/oauth/request
  4. OAuth访问URL(例如: http//somesite.com/oauth/access
  5. 客户密钥(例如:12345678)
  6. 客户秘密(例如:abcdefghijklmnop)

现在,我已经看过DotNetOpenAuth和OAuth.NET库,虽然我确信他们非常有能力做我需要的东西,但我无法弄清楚如何以这种方式使用它们。

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

谢谢!

我一个月前刚刚开始使用OAuth,并且也被所有这些库弄糊涂了。 我对这些库的一个看法是,它们非常复杂(正如你已经发现的那样)。 使其变得困难的另一件事是没有很多例子(在我的情况下更糟糕,因为我试图实现提供者而不是客户端)。

最初,我想使用最新的OAuth 2.0,但实现它的唯一.NET库是DotNetOpenAuth。 它可能是最完整的.NET OAuth库之一,但我需要很长时间才能理解(由于不了解WCF,MVC等)。 我已经降级到OAuth 1.0a,因为我发现了DevDefined OAuth的这些示例 我不了解你,但我发现从例子中学习更容易。

看起来您只想实现客户端,因此请务必查看Consumer示例。 尝试编译示例并忽略Provider示例,因为您不需要它们,它会让您更加困惑。 耐心点。 如果您仍然感到困惑,那么查看为其他语言制作的一些库可能是个好主意,因为它们可能更容易理解文档。

好的,我知道你的上一篇文章是几个月前的,但是如果你还在为此工作(或者像我这样喜欢看到这个问题答案的人),这里有一些关于你在创建OAuth时遇到的NullReferenceException的信息请求:

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

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

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

结果代码看起来像这样:

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中它将是:

//
// 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);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM