PowerShell脚本使用访问令牌下载bitBucket私有存储库

时间:2016-10-03 08:49:46

标签: powershell bitbucket

我试图通过首先从bitbucket获取代码来自动化构建过程。

$output = "E:\FileName.xyz"
$url = 'https://bitbucket.org/WhatEver/WhatEverBranchName/get/master.zip'
$wc = New-Object -TypeName System.Net.WebClient
$wc.Headers.Add('Authorization','token oinksdilikncl--MyAccessToken--ioiwcnoisif89kfg9')
$wc.DownloadFile($url, $output)

当我执行此操作时,我在FileName.xyz收到的文件是一个html文件,它将我重定向到bitbucket的登录页面,基本上它要求输入信用卡,即使我提供了访问令牌。

我哪里错了?有没有其他方法可以做到这一点,Invoke-Webrequest?或者有人请我直接找一个代码示例?

3 个答案:

答案 0 :(得分:2)

我对powershell没有任何经验,但我尝试在节点中执行类似的任务,这是我的发现。

  1. 首先,在bitbucket帐户设置的访问管理部分创建“Oauth”。这会给你一个“钥匙”和一个“秘密”。

  2. 现在使用这些Key和Secret,你会问Bitbucket一个令牌。在我的情况下,我向https://bitbucket.org/site/oauth2/access_token发出了http请求。在你的情况下,你应该使用相当于CURL(可能是Invoke-RestMethod?)。 CURL命令是这样的:

    $ curl -X POST -u "yourKeyHere:yourSecretHere" https://bitbucket.org/site/oauth2/access_token -d grant_type=client_credentials
    

    我的http请求就像这样(在节点中使用superagent),Content-Type设置为application/x-www-form-urlencoded

    request.post("https://yourKeyHere:yourSecretHere@bitbucket.org/site/oauth2/access_token").send('grant_type=client_credentials');
    
  3. 现在您已拥有令牌,您的程序或命令可以使用它克隆私人仓库。但你的回购的网址应该是这样的(保持括号围绕代币):

    https://x-token-auth:{tokenHere}@bitbucket.org/youRepoOwnerHere/RepoNameHere.git
    
  4. 现在您的计算机上已经有了整个代码库。但是你想要一个单独的文件,而不是整个仓库,我将你引用到这个Retrieve a single file from a repository,但是请记住使用上面的repo url和令牌而不是正常的repo url。

答案 1 :(得分:1)

实际上,至少现在(原帖后2年),事情比这更容易,因为它足以做基本身份验证。因此,只要脚本是私有的,你就没有问题写入其中的信用,以下应该是技巧

Invoke-WebRequest -uri '<url>' -Headers @{ Authorization = 'Basic <auth_str_b64>' } -OutFile <dest_path>

其中:
  - url类似https://bitbucket.org/<account>/<repo_name>/get/<branch_or_tag_or_whatever>.zip,从所需存储库的“下载”页面获取   - auth_str_b64是通常的<username>:<password>对base64编码

您可以使用以下命令创建/计算编码字符串:

$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes('<username>:<password>'))

为了避免在脚本中保留信誉,您可以将它们作为参数传递或在运行时提示它们。

答案 2 :(得分:0)

我已经解决了这个问题:

# Instanciate the WebClient    
$wc = New-Object -TypeName System.Net.WebClient
# Add the base64 encoded credentials
$wc.Headers.Add('Authorization','Basic {0}' -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f '{USERNAME}','{TOKEN}'))))
# Download the file
$wc.DownloadFile( 'https://{BITBUCKET_URL}/projects/{PROJECT}/repos/{REPOSITORY}/raw/{FILE.EXT}?at=refs%2Fheads%2F{BRANCH}', 'C:\file.txt' )

我假设您正在使用Personal Access Token。哦,它比Invoke-WebRequest或Invoke-RestMethod快得多。