2010-06-13 7 views
10

Próbuję utworzyć moduł uwierzytelniania w CSharp, w którym muszę zweryfikować podpis od żądania przy użyciu biblioteki DotNetOpenAuth (DNOA) dla dwuetapowej autoryzacji OAuth, która ma tylko klucz klienta i tajny klucz.Czy ktoś zaimplementował dwuetapową OAuth przy użyciu DNOA?

Jeśli pomocna byłaby przykładowa implementacja dwuetapowej autoryzacji OAuth przy użyciu DNOA. Jeśli nie, wszelkie pomysły dotyczące wdrożenia również będą działać. Każda pomoc byłaby mile widziana.

+0

Czy zdarzyło Ci się, że moduł uwierzytelniający został już opracowany? Szukam czegoś podobnego. Jedyną odpowiedzią jest tutaj stworzenie konsumenta. – AlexGad

Odpowiedz

6

Nie udało mi się uzyskać DNOA, aby pracować z 2-nogged OAuth, więc skończyłem na tym, że mój własny klient używał http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs jako mojej klasy bazowej do obsługi podpisu. Wszystko, co musisz zrobić, to podklasa go i użyć metod sygnatur budować nagłówek autoryzacji 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 + "\""; 

Gdy masz nagłówek autoryzacji tylko budować swoją prośbę internetowej i wysłać go ...

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

Aktualizacja: Udało mi się również uzyskać 2-legged do pracy z oauth konsumenta 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(); 

Byłoby miło, gdyby miał pustą konstruktora lub przeciążenie, że po prostu ma w kontekście, ale to wydaje się działać.

+0

Tylko FYI - ale DevDefined.OAuth ma przeciążone konstruktory OAuthSession, które tylko przyjmują kontekst konsumenta w tych dniach, a także obsługę XAuth (używane przez Twitter API itp. Https://dev.twitter.com/docs/ oauth/xauth), które ulepszają dwuetapową historię OAuth 1.0a. – Bittercoder

Powiązane problemy