2010-05-12 15 views
6

Me han dado 6 bits de información para acceder a algunos datos de una página web:OAuth en C# como cliente

  1. sitio web JSON URL (por ejemplo: http://somesite.com/items/list.json)
  2. OAuth autorización de direcciones URL (por ejemplo: http://somesite.com/oauth/authorization)
  3. OAuth petición de URL (por ejemplo: http://somesite.com/oauth/request)
  4. OAuth acceso de URL (por ejemplo: http://somesite.com/oauth/access)
  5. Key cliente (por ejemplo: 12345678)
  6. secreta de cliente (por ejemplo: abcdefghijklmnop)

Ahora, he mirado en las bibliotecas DotNetOpenAuth y OAuth.NET, y aunque estoy seguro de que son muy capaces de hacer lo que necesito, yo no puedo entender cómo usarlo de esta manera.

¿Alguien podría publicar un código de ejemplo de cómo consumir la Url (Punto 1) en cualquiera de las bibliotecas (o de cualquier otra manera que pueda funcionar igual de bien)?

Gracias!

+1

Lo sentimos, olvidé mencionar que esto está usando OAuth 1.0a – Redth

Respuesta

4

También comencé a trabajar con OAuth hace un mes y también me confundieron todas estas bibliotecas. Una cosa que me di cuenta acerca de estas bibliotecas es que son bastante complicadas (como habrás descubierto). Otra cosa que lo hace difícil es que no hubo mucho ejemplo (fue peor en mi caso porque estaba tratando de implementar un Proveedor y no un Cliente).

Originalmente, quería utilizar el último OAuth 2.0 pero la única biblioteca .NET que lo implementa es DotNetOpenAuth. Probablemente sea una de las más completas de la biblioteca .NET OAuth pero me tomará mucho tiempo entender (debido a que no conozco WCF, MVC, etc.). Desde entonces he degradado a OAuth 1.0a porque encontré estos examples para DevDefined OAuth. No sé ustedes, pero me resultó más fácil aprender de los ejemplos.

Parece que solo quiere implementar un cliente, así que asegúrese de consultar los ejemplos de los consumidores. Intenta compilar los ejemplos e ignora los ejemplos de Proveedor porque no los necesitas y te confundirán más. Se paciente. Si todavía está confundido, podría ser una buena idea mirar algunas de las bibliotecas creadas para otros idiomas, ya que podrían tener documentos más fáciles de entender.

+0

Por cierto, creo que DotNetOpenAuth no tiene soporte para OAuth 2.0 todavía. – Alexandra

1

Para OAuth 2.0:

aprendí que lo más fácil es sólo hay que poner la página de autenticación en una ventana HTML, entonces la trampa señal_acceso devuelto. A continuación, puede hacerlo usando el navegador web del lado del cliente.

Por ejemplo, en MonoTouch sería:

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

Gracias, desafortunadamente, estoy trabajando con oauth 1.0a que no mencioné en la pregunta ... – Redth

1

OK, sé que su último mensaje fue hace meses, pero en caso de que todavía estaban trabajando en esto (o para gente como yo, que hubiera querido para ver una respuesta a esta pregunta), aquí hay información sobre el NullReferenceException que encontró al crear la solicitud de OAuth:

La referencia nula proviene del IServiceLocator que se usa para resolver dependencias. Si no pasa explícitamente uno al constructor, usa la propiedad estática ServiceLocator.Current en el espacio de nombres Microsoft.Practices.ServiceLocation.

Este es uno de los muchos inconvenientes del uso de métodos estáticos y el estado global, ¿está ocultando problemas como este al consumidor de su API? Por lo tanto, si no ha especificado un localizador de servicio predeterminado, se devuelve null, lo que da como resultado NullReferenceException.

Para solucionar este problema, conecté una implementación de IServiceLocator que usa StructureMap (uno de los muchos contenedores de IoC disponibles) como contenedor. Por último, tendrá que registrar instancias para dos interfaces: ISigningProvider y INonceProvider. Afortunadamente, existen varias implementaciones estándar en el ensamblaje OAuth.Net.Components, como GuidNonceProvider y HmacSha1SigningProvider.

El código resultante se parece a algo como esto:

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

Me di cuenta que no es la solución definitiva a su pregunta original (todavía estoy trabajando en conseguir yo mismo trabajo), pero espero que sea te lleva unos pasos más allá. Y si por mucho tiempo has abandonado esta implementación ... bueno, ¡feliz codificación de todos modos!

Cuestiones relacionadas