2011-02-11 21 views
5

Estoy tratando de usar OAuth para la autenticación de la API de FreshBooks desde mi aplicación ASP.NET MVC C#. Aquí es lo que tengo hasta ahora:Autenticación a FreshBooks a través de DotNetOpenAuth

estoy usando DotNetOpenAuth Aquí está el código que tengo en la acción del controlador

if (TokenManager != null) 
{ 
    ServiceProviderDescription provider = new ServiceProviderDescription(); 
    provider.ProtocolVersion = ProtocolVersion.V10a; 
    provider.AccessTokenEndpoint = new MessageReceivingEndpoint  ("https://myfbid.freshbooks.com/oauth/oauth_access.php", DotNetOpenAuth.Messaging.HttpDeliveryMethods.PostRequest); 
    provider.RequestTokenEndpoint = new DotNetOpenAuth.Messaging.MessageReceivingEndpoint("https://myfbid.freshbooks.com/oauth/oauth_request.php", DotNetOpenAuth.Messaging.HttpDeliveryMethods.PostRequest); 
    provider.UserAuthorizationEndpoint = new DotNetOpenAuth.Messaging.MessageReceivingEndpoint("https://myfbid.freshbooks.com/oauth/oauth_authorize.php", DotNetOpenAuth.Messaging.HttpDeliveryMethods.GetRequest); 
    provider.TamperProtectionElements = new ITamperProtectionChannelBindingElement[] { new HmacSha1SigningBindingElement() }; 

    var consumer = new WebConsumer(provider, TokenManager); 

    var response = consumer.ProcessUserAuthorization(); 
    if (response != null) 
    { 
     this.AccessToken = response.AccessToken; 
    } 
    else 
    { 
     // we need to request authorization 
     consumer.Channel.Send(consumer.PrepareRequestUserAuthorization(
      new Uri("http://localhost:9876/home/testoauth/"), null, null)); 
    } 
} 

El TokenManager es la misma clase que se proporciona con la muestra DotNetOpenAuth, I' he establecido mi secreto de consumidor que FreshBooks me dio.

Por consumer.Channel.Send(consumer.PrepareRequestUserAuthorization(...)) Tengo la siguiente excepción:

"The remote server returned an error: (400) Bad Request.".

estoy haciendo esto correctamente? Basado en documentación de FreshBooks y muestras de DotNetOpenAuth que deberían funcionar correctamente.

¿Existe alguna manera más simple de autenticarse con OAuth, ya que DotNetOpenAuth es un poco enorme para simplemente usar la autenticación OAuth?

Respuesta

5

Si desea utilizar DotNetOpenAuth que necesita para asegurarse de que:

  • utiliza el método de firma "TEXTO SIMPLE"
  • y utilizar PlaintextSigningBindingElement como TamperProtect ionElements

algo como esto funciona para mí:

public static readonly ServiceProviderDescription ServiceDescription = new ServiceProviderDescription 
{ 
    ProtocolVersion = ProtocolVersion.V10a, 
    RequestTokenEndpoint = new MessageReceivingEndpoint(oAuthBase + "/oauth_request.php", HttpDeliveryMethods.PostRequest), 
    UserAuthorizationEndpoint = new MessageReceivingEndpoint(oAuthBase + "/oauth_authorize.php", HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest), 
    AccessTokenEndpoint = new MessageReceivingEndpoint(oAuthBase + "/oauth_access.php", HttpDeliveryMethods.PostRequest | HttpDeliveryMethods.AuthorizationHeaderRequest), 
    TamperProtectionElements = new ITamperProtectionChannelBindingElement[] { new PlaintextSigningBindingElement() } 
}; 

public static void RequestAuthorization(WebConsumer consumer) 
{ 
    if (consumer == null) 
    { 
     throw new ArgumentNullException("consumer"); 
    } 

    var extraParameters = new Dictionary<string, string> { 
     { "oauth_signature_method", "PLAINTEXT" }, 
    }; 
    Uri callback = Util.GetCallbackUrlFromContext(); 
    var request = consumer.PrepareRequestUserAuthorization(callback, extraParameters, null); 
    consumer.Channel.Send(request); 
} 
1

Puede intentar usar mi biblioteca OAuth de código abierto. Es extremadamente simple de usar y ponerse en marcha. Tengo un proyecto de muestra que está disponible en la descarga que se conecta a Google, Twitter, Yahoo y Vimeo. De forma intencionada, he mantenido el código muy simple, así que es fácil de entender.

OAuth C# Library

No he utilizado FreshBooks, pero debe ser una simple cuestión de cambiar la dirección URL de uno de los proveedores en la aplicación de ejemplo y por supuesto la creación de proveedor de teclas específicas etc.

+0

Gracias por compartir, lo reconozco su biblioteca es fácil de usar, aunque tengo el mismo error 400 Bad Request, voy a empezar pensar que me relacioné con FreshBooks y no con mi implementación. Voy a consultar con ellos directamente. –

Cuestiones relacionadas