OAuth в C # как клиент - PullRequest
       6

OAuth в C # как клиент

6 голосов
/ 12 мая 2010

Мне дали 6 бит информации для доступа к некоторым данным с веб-сайта:

  1. Сайт Json Url (например: http://somesite.com/items/list.json)
  2. URL авторизации OAuth (например: http://somesite.com/oauth/authorization)
  3. URL-адрес запроса OAuth (например: http://somesite.com/oauth/request)
  4. URL доступа OAuth (например: http://somesite.com/oauth/access)
  5. Ключ клиента (например: 12345678)
  6. Секрет клиента (например, abcdefghijklmnop)

Теперь я посмотрел на библиотеки DotNetOpenAuth и OAuth.NET, и, хотя я уверен, что они очень способны делать то, что мне нужно, я просто не могу понять, как их использовать таким образом.

Может ли кто-нибудь опубликовать пример кода о том, как использовать URL (пункт 1.) в любой библиотеке (или любым другим способом, который также может работать)?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

Я также только начал работать с OAuth месяц назад и также был смущен всеми этими библиотеками. Одна вещь, которую я понял об этих библиотеках, это то, что они довольно сложные (как вы узнали). Другая вещь, которая усложняет задачу, заключается в том, что примеров было не так много (в моем случае это было хуже, потому что я пытался реализовать Поставщика, а не Клиента).

Изначально я хотел использовать последнюю версию OAuth 2.0, но единственная библиотека .NET, которая реализует ее, - это DotNetOpenAuth. Вероятно, это одна из самых полных библиотек .NET OAuth, но я пойму слишком долго (из-за незнания WCF, MVC и т. Д.). С тех пор я понизился до OAuth 1.0a, потому что нашел эти примеры для DevDefined OAuth . Я не знаю о вас, но мне было легче учиться на примерах.

Похоже, вы хотите реализовать только Клиент, поэтому обязательно ознакомьтесь с примерами Consumer. Попробуйте скомпилировать примеры и игнорируйте примеры провайдеров, потому что они вам не нужны, и это еще больше запутает вас. Потерпи. Если вы все еще в замешательстве, было бы неплохо взглянуть на некоторые библиотеки, созданные для других языков, так как они могли бы легче понять документацию.

2 голосов
/ 11 февраля 2011

ОК, я знаю, что ваш последний пост был несколько месяцев назад, но если вы все еще работали над этим (или для таких людей, как я, которые хотели бы увидеть ответ на этот вопрос), вот некоторая информация относительно NullReferenceException вы столкнулись с созданием запроса OAuth:

Пустая ссылка взята из IServiceLocator, который используется для разрешения зависимостей. Если вы явно не передаете его в конструктор, он использует статическое свойство ServiceLocator.Current в пространстве имен Microsoft.Practices.ServiceLocation.

Это одна из многих ловушек использования статических методов и глобального состояния, если вы скрываете подобные проблемы от потребителя своего API. Так что если вы не указали локатор службы по умолчанию, то возвращается null, в результате чего NullReferenceException.

Итак, чтобы решить эту проблему, я реализовал реализацию IServiceLocator, в которой в качестве контейнера используется StructureMap (один из множества доступных контейнеров IoC). Наконец, вам нужно зарегистрировать экземпляры для двух интерфейсов: ISigningProvider и INonceProvider. К счастью, в сборке 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; });

Я понимаю, что это не окончательное решение вашего первоначального вопроса (я все еще работаю над тем, чтобы он сам работал), но я надеюсь, что это продвинет вас на несколько шагов дальше. И если вы вообще давно отказались от этой реализации ... ну, в любом случае, удачного кодирования!

1 голос
/ 17 мая 2010

Для OAuth 2.0:

Я узнал, что проще всего разместить страницу аутентификации в окне HTML, а затем перехватить возвращенный access_token. Затем вы можете сделать это, используя веб-браузер на стороне клиента.

Например, в 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...