VSTS 个人访问令牌 (PAT) 与 OAUTH:不同的查询结果
VSTS Personal Access Token (PAT) vs OAUTH: different results of query
我正在使用 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)
帐户的权限:
同样重要的是,我们不使用托管代理,而是使用自定义代理。
问题是比较 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 调用并检索相同数量的变更集。
我正在使用 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)
帐户的权限:
同样重要的是,我们不使用托管代理,而是使用自定义代理。
问题是比较 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 调用并检索相同数量的变更集。