Для потомков вы не хотите использовать следующее для загрузки отдельного файла из bitbucket:
https://api.bitbucket.org/2.0/repositories/MyCompany/myrepo/downloads/path/to/your/file.txt
(«Загрузки» означает загрузку целых файлов репо, например, ZIP-файла)
Вместо этого вы хотите сделать:
curl --user myuser@mydomain.com:password "https://api.bitbucket.org/2.0/repositories/MyCompany/myrepo/src/master/path/to/file.txt"
Если вы пытаетесь использовать Invoke-RestRequest (в powershell), обратите внимание, что есть несколько дополнительных шагов. Со старым 1.0 API вы могли сделать:
$cred = Get-Credential
$uri = "https://api.bitbucket.org/1.0/repositories/MyCompany/$($filepath)"
# Get the files from bitbucket (GIT)
Invoke-RestMethod -Credential $cred -Uri $uri -Proxy $proxyUri -OutFile $destination
С новым 2.0 API, который больше не работает. Invoke-RestMethod от Powershell ждет ответа 401 перед отправкой учетных данных, и новый API-интерфейс 2.0 bitbucket никогда его не предоставляет, поэтому учетные данные никогда не отправляются, что приводит к запрету 403.
Чтобы обойти это, вы должны использовать следующий уродливый хак, чтобы заставить Invoke-RestMethod немедленно отправлять учетные данные в заголовок авторизации:
$cred = Get-Credential
$uri = "https://api.bitbucket.org/2.0/repositories/MyCompany/$($filepath)"
$username = ($cred.GetNetworkCredential()).username
$password = ($cred.GetNetworkCredential()).password
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))
# Get the files from bitbucket (GIT)
Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Uri $uri -Proxy $proxyUri -OutFile $destination
Надеюсь, это поможет кому-то еще в будущем!
Спасибо @Джим Редмонду за помощь.