Аутентификация в FreshBooks через DotNetOpenAuth - PullRequest
5 голосов
/ 12 февраля 2011

Я пытаюсь использовать OAuth для аутентификации для API FreshBooks из моего приложения ASP.NET MVC C #. Вот что у меня есть:

Я использую DotNetOpenAuth, вот код, который я имею в своем действии контроллера

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

TokenManager - это тот же класс, который предоставляется в образце DotNetOpenAuth, я установил свой потребительский секрет, который мне подарил FreshBooks.

На consumer.Channel.Send(consumer.PrepareRequestUserAuthorization(...)) я получил следующее исключение:

«Удаленный сервер возвратил ошибку: (400) неверный запрос.».

Я правильно это делаю? На основе документации FreshBooks и примеров DotNetOpenAuth, которые должны работать правильно.

Есть ли более простой способ аутентификации с помощью OAuth, так как DotNetOpenAuth немного прост для простого использования аутентификации OAuth?

Ответы [ 2 ]

5 голосов
/ 04 мая 2011

если вы хотите использовать DotNetOpenAuth, вам необходимо убедиться, что:

  • вы используете метод подписи "PLAINTEXT"
  • и используете PlaintextSigningBindingElement в качестве TamperProtectionElements

как-то так у меня работает:

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 голос
/ 12 февраля 2011

Вы можете попробовать использовать мою OAuth-библиотеку с открытым исходным кодом. Это очень просто в использовании и начать работу. У меня есть пример проекта, который доступен для скачивания и который подключается к Google, Twitter, Yahoo и Vimeo. Я специально держал код очень простым, чтобы его было легко понять.

Библиотека OAuth C #

Я не использовал FreshBooks, но нужно просто изменить URL-адрес одного из провайдеров в образце приложения и, конечно же, настроить ключи для конкретного провайдера и т. Д.

...