Как загрузить частный репозиторий bitbucket.org, используя чистые вызовы REST API версии 1 или 2

Я пытаюсь клонировать/загрузить свой частный репозиторий bitbucket.org с помощью C#, но я хочу сделать это, используя чистые вызовы HTTPS REST, а не стороннюю библиотеку, я хочу узнать, как это работает.

До сих пор я мог найти пример кода только для версии 1 API. Это то, что я до сих пор работаю на С#:

static void AUthenticate()
    {
        var time = GenerateTimeStamp();
        var url = "https://bitbucket.org/api/1.0/oauth/request_token";
        var secret = "SECRET";
        var key = "KEY";

        var sigBaseStringParams = "";
        sigBaseStringParams += "oauth_callback=http%3A%2F%2Flocal%3Fdump";
        sigBaseStringParams += "&" + "oauth_consumer_key=" + key;
        sigBaseStringParams += "&" + "oauth_nonce=" + GetNonce();
        sigBaseStringParams += "&" + "oauth_signature_method=" + "HMAC-SHA1";
        sigBaseStringParams += "&" + "oauth_timestamp=" + time;
        sigBaseStringParams += "&" + "oauth_version=1.0";
        var sigBaseString = "POST&";
        sigBaseString += Uri.EscapeDataString(url) + "&" + Uri.EscapeDataString(sigBaseStringParams);

        var signature = GetSignature(sigBaseString, secret);

        var res = PostData(url, sigBaseStringParams + "&oauth_signature=" + Uri.EscapeDataString(signature));

        var items = GetParameters(res);

        var tokenSecret = items["oauth_token_secret"];
        var token = items["oauth_token"];
        var callbackConfirmed = items["oauth_callback_confirmed"];

        url = "https://bitbucket.org/api/1.0/oauth/authenticate?oauth_token=" + token;
    }

Это аутентифицирует, и я возвращаю 3 значения. Последний URL-адрес, который я вставляю в браузер, где я предоставляю доступ своему приложению, и я получаю oauth_verifier

Примечание: я действительно не хочу этого делать, так как я пишу серверную программу, которая на самом деле не сможет отправить пользователя по ссылке браузера (но по одной за раз)

Затем я запускаю следующий код:

var url = "https://bitbucket.org/api/1.0/oauth/access_token";

        var token = "TOKEN FROM PREV CALL";
        var time = GenerateTimeStamp();
        var sigBaseStringParams = "";
        //sigBaseStringParams += "oauth_callback=http%3A%2F%2Flocal%3Fdump";

        var secret = "SECRET";
        var key = "KEY";

        sigBaseStringParams += "oauth_consumer_key=" + key;
        sigBaseStringParams += "&" + "oauth_token=" + token;
        sigBaseStringParams += "&" + "oauth_nonce=" + GetNonce();
        sigBaseStringParams += "&" + "oauth_signature_method=" + "HMAC-SHA1";
        sigBaseStringParams += "&" + "oauth_timestamp=" + time;
        sigBaseStringParams += "&" + "oauth_verifier=AUTH VERIFIER FROM PREV CALL";
        var sigBaseString = "POST&";
        sigBaseString += Uri.EscapeDataString(url) + "&" + Uri.EscapeDataString(sigBaseStringParams);

        var tokenSecret = "TOKEN SECRET FROM PREVIOUS CALL";
        var signature = GetSignature(sigBaseString, secret, tokenSecret);

        var res = PostData(url, sigBaseStringParams + "&oauth_signature=" + Uri.EscapeDataString(signature));

Это дает мне 400 неверных запросов. Я больше ничего не вижу.

Я следую инструкциям на этой странице: https://confluence.atlassian.com/bitbucket/oauth-on-bitbucket-cloud-238027431.html#OAuthonBitbucketCloud-Refreshtokens

Почему я делаю это, потому что я хочу в конечном итоге сделать запрос POST (или GET) на этот URL:

var url2 = "https://bitbucket.org/ACCOUNT/REPOSITORY/get/tip.zip?access_token="+token;

Потому что я думаю, что это даст мне весь репозиторий в zip-файле. Если я помещу это в браузер, это сработает, потому что я вошел в битбакет.

Если есть более новый/более простой/лучший способ, я открыт для предложений.

заранее спасибо


person Quintonn    schedule 21.06.2017    source источник
comment
Вы можете временно использовать сторонние инструменты и посмотреть, что они делают с помощью Fiddler, или просмотреть исходный код для третьей стороны либо с фактическим исходным кодом, либо с помощью dotPeek, если он не запутан.   -  person TyCobb    schedule 21.06.2017
comment
Это один из способов, но как они это поняли? Конечно, документация должна быть доступна, так как это общедоступный API. Я уверен, что просто ищу не в том месте или что-то упускаю.   -  person Quintonn    schedule 22.06.2017


Ответы (1)


Я нашел очень простое решение. Мне просто нужно было предоставить учетные данные для запроса GET:

 public static void Downloadfiles(string username, string password, string account, string repository, string pathToSave)
    {
        var creds = Base64Encode(String.Format("{0}:{1}", username, password));

        var url = String.Format("https://bitbucket.org/{0}/{1}/get/tip.zip", account, repository);

        using (var client = new WebClient())
        {

            client.Headers.Add("Authorization", "Basic " + creds);
            client.Headers.Add("Content-Type", "application/octet-stream");
            client.DownloadFile(url, pathToSave);
        }
    }
person Quintonn    schedule 29.06.2017