Кто-нибудь реализовал 2 Legged OAuth с использованием DNOA?

Я пытаюсь создать модуль аутентификации в CSharp, где мне нужно проверить подпись из запроса, используя библиотеку DotNetOpenAuth (DNOA) для двухстороннего OAuth, которая имеет только потребительский ключ и секрет.

Если у вас есть образец реализации двухстороннего OAuth с использованием DNOA, это было бы полезно. Если нет, любые идеи о том, как реализовать, тоже будут работать. Любая помощь приветствуется.


person Madhavi Venu    schedule 13.06.2010    source источник
comment
Вы когда-нибудь разрабатывали модуль аутентификации? Я ищу что-то подобное. Единственный ответ здесь — создание потребителя.   -  person AlexGad    schedule 24.09.2011


Ответы (1)


Мне не удалось заставить DNOA работать с двусторонним протоколом OAuth, поэтому я создал своего собственного потребителя, используя http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs в качестве базового класса для обработки подписи подписи. Все, что вам нужно сделать, это подклассировать его и использовать методы подписи для создания заголовка авторизации http...

string sigMethodType = GetSigMethodType();
string ts, nonce, normalizedUrl, normalizedParams;
string sig = GenerateSignature(new Uri("http://some-endpoint-to-call"), "GET", out nonce, out ts, out normalizedUrl, out normalizedParams);

string header = "OAuth realm=\"" + normalizedUrl + "\"," +
                OAuthConsumerKeyKey + "=\"" + ConsumerKey + "\"," +
                OAuthSignatureMethodKey + "=\"" + "HMACSHA1SignatureType" + "\"," +
                OAuthSignatureKey + "=\"" + sig + "\"," +
                OAuthTimestampKey + "=\"" + ts + "\"," +
                OAuthTokenKey + "=\"" + String.Empty + "\"," +
                OAuthNonceKey + "=\"" + nonce + "\"," +
                OAuthVersionKey + "=\"" + OAuthVersion + "\"";

Когда у вас есть заголовок авторизации, просто создайте свой веб-запрос и отправьте его...

var wr = (HttpWebRequest)HttpWebRequest.Create(messageEndpoint.Location);
wr.Headers.Add(HttpRequestHeader.Authorization, BuildAuthHeader(messageEndpoint));
wr.ContentType = messageEndpoint.ContentType;
wr.Method = CdwHttpMethods.Verbs[messageEndpoint.HttpMethod];
using (var resp = (HttpWebResponse)req.GetResponse())
{
    switch (resp.StatusCode)
    {
        case HttpStatusCode.Unauthorized:
            Assert.Fail("OAuth authorization failed");
            break;
        case HttpStatusCode.OK:
            using (var stream = resp.GetResponseStream())
            {
                using (var sr = new StreamReader(stream))
                {
                    var respString = sr.ReadToEnd();
                }
            }
            break;
    }
}

Обновление: мне также удалось заставить 2-legged работать с потребителем oauth от devdefined. http://code.google.com/p/devdefined-tools/wiki/OAuthConsumer

var endPoint = new Uri("http://example.com/restendpoint.svc");
            var ctx = new OAuthConsumerContext
                        {
                            ConsumerKey = "consumerkey1",
                            ConsumerSecret = "consumersecret1",
                            SignatureMethod = SignatureMethod.HmacSha1
                        };

            var session = new OAuthSession(ctx, endPoint, endPoint, endPoint);
            var respText = session.Request().Get().ForUri(endPoint).ToString();

Было бы неплохо, если бы у него был пустой конструктор или перегрузка, которая просто принимает контекст, но, похоже, это работает.

person JoshSchlesinger    schedule 17.12.2010
comment
Просто к вашему сведению, но DevDefined.OAuth имеет перегруженные конструкторы OAuthSession, которые в наши дни принимают только потребительский контекст, а также поддержку XAuth (используемого API Twitter и т. д. dev.twitter.com/docs/oauth/xauth), которые улучшают двухстороннюю историю OAuth 1.0a. - person Bittercoder; 29.12.2011