C # может писать, но не читать BitBucket API для репозиториев - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь получить доступ к API BitBucket с помощью C #.Я могу выполнять некоторые действия, но не другие.Примечательно, что запись в репозитории работает, но чтение их не дает.

using System.Net;
using System.Collections.Specialized;

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; // TLS v1.2 only
var client = new WebClient()
{
    Credentials = new NetworkCredential("user", "app_password"),
    BaseAddress = "https://api.bitbucket.org",
};

client.DownloadString(
    "/2.0/repositories/friendly_private_account/repo");     // 403 Forbidden
client.DownloadString(
    "/2.0/repositories/friendly_private_account/repo/src"); // 403 Forbidden
client.UploadValues(
    "/2.0/repositories/friendly_private_account/repo/src",
    new NameValueCollection() {
        { "/bb.txt", "here is\nsome content\n" },
        { "message", "Commit from API, called with C# WebClient" },
    });                                                     // Creates a commit! What!?

Это немного странно, поскольку вы получаете разрешение read автоматически, есливы включаете разрешение write при создании пароля приложения.

Это также не проблема для DownloadString().Если пароль приложения имеет разрешение webhook, вы можете прочитать веб-хуки.

client.DownloadString(
    "/2.0/repositories/friendly_private_account/repo/hooks");
// {"pagelen": 10, "values": [{ … }]}

Интересно, что у curl нет проблем с теми же учетными данными.

$ curl --user "${user}:${app_password}" \
       --url "https://api.bitbucket.org/2.0/repositories/friendly_private_account/repo"
# {"scm": "git", "website": "", "has_wiki": false, … }

Выполнение curl с --verbose фактически вернет заголовки, которые описывают, какие разрешения имеют ваши учетные данные и , какие разрешения требуются.В приведенном выше примере требуется repository, а у меня repository:write.Это не говорит о том, что у меня repository:read, но, тем не менее, запрос выполнен успешно.

1 Ответ

0 голосов
/ 19 февраля 2019

Похоже, что WebClient отправляет заголовок Authorization только тогда, когда сервер отвечает 401 Unauthorized.

Возможно, BitBucket отвечает 401на некоторых неаутентифицированных конечных точках провоцирует WebClient повторно отправить запрос с аутентификацией;но возвращает 403 для других, немедленно заканчивая запрос.

Явное добавление заголовка Authorization исправляет ситуацию, хотя и немного уродливо.

using System.Net;
using System.Collections.Specialized;

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;  // TLS v1.2 only
var client = new WebClient()
{
    // Credentials = new NetworkCredential("user", "app_password"), // Take this line out
    BaseAddress = "https://api.bitbucket.org",
};

client.Headers[HttpRequestHeader.Authorization] =
    "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes("user:app_password"));

client.DownloadString(
    "/2.0/repositories/friendly_private_account/repo");             // Now it works
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...