VSTS个人访问令牌(PAT)与OAUTH:不同的查询结果

时间:2018-06-21 12:02:19

标签: powershell oauth azure-devops azure-pipelines-release-pipeline tfvc

我正在使用PowerShell任务来在特定时间点之后查询TFVC存储库中的更改。为了进行本地开发,我创建了与用户相关的PAT。在版本定义中,我启用了Allow scripts to access OAUTH token。如果我现在分别使用PAT和OAUTH来执行发布定义,那么对于现有更改,我会得到不同的结果(例如,对于PAT,计数为1,对于OAUTH为0)。查询完全相同:

https://xxx.visualstudio.com/xxx/_apis/tfvc/changesets?searchCriteria.itemPath=$projectPath&searchCriteria.fromDate=$cloudVersionTimestampUTC&api-version=4.1

这里是执行查询的代码:

Write-Host "Get Request with the URI '$uri'"
if ($localDevelopment) {
    $GetResponse = Invoke-RestMethod `
        -Uri $uri `
        -Headers @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($env:SYSTEM_ACCESSTOKEN)")) } 

    Write-Host "Requested last changes for local development: $($GetResponse | ConvertTo-Json -Depth 100)"  
}
else {
    $GetResponse = Invoke-RestMethod `
        -Uri $uri `
        -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" } 
    Write-Host "Requested last changes: $($GetResponse | ConvertTo-Json -Depth 100)"
}

有人知道为什么会这样吗?

谢谢

编辑: Project Collection Build Service (xxx)帐户的权限如下: permissions

同样重要的是,我们不使用托管代理,而是使用自定义代理。

1 个答案:

答案 0 :(得分:0)

问题是比较PAT和OAUTH时时间戳的不同处理。如您所见,我将变量$cloudVersionTimestampUTC用于fromDate。设置时间戳时,我没有添加Z(如MM-dd-yyyy HH:mm:ss而不是MM-dd-yyyy HH:mm:ssZ)。当未提供Z时,PAT使用给定的时间戳记为UTC,OAUTH将其解释为本地时间(但是我不确定是什么时间,例如默认配置文件)。当然,这导致了不同数量的变更集(如果缺少的变更集是UTC与本地时间之间的时差)。

最后,我必须明确说明时间戳。因此,我要做的是将时间戳记作为字符串存储在Azure资源中,并执行以下操作:

$cloudVersionTimestampUTC = [DateTime]($cloudJobDefinition.Tags.'version-timestamp')
$cloudVersionTimestampUTC = (Get-Date -Date $cloudVersionTimestampUTC).ToString("MM-dd-yyyy HH:mm:ssZ")

然后,我能够进行REST调用并检索相同数量的变更集。