通过 DevOps Rest API 为 Azure DevOps pipeline 用户添加 SSH 密钥

4
我想将SSH公钥添加到运行我的YAML管道的Azure DevOps帐户中。根据这篇文章:Azure DevOps API Add public key,在使用PAT令牌进行身份验证时,可以在上传公钥时实现此操作。
我可以从我的管道访问Azure DevOps Rest API,并通过Rest API列出存储库等,但我无法弄清楚如何构建用于上传公共SSH密钥的查询体。到目前为止,我有以下内容:
$uri = 'https://dev.azure.com/{MyOrg}/_usersSettings/keys'
$Headers = @{Authorization='Basic <encoded PAT>';'content-type'='application/json'}
$Body = @{
    displayName = 'MyKey'
    publicData = 'My Public Key starting with ssh-rsa '
    scope = 'app_token'
    isPublic = $true
    } | ConvertTo-Json
Invoke-RestMethod -Uri $uri -Headers $Headers -Method POST -Body $body


以上命令没有出现错误,只是产生了一个很长的HTML。
非常欢迎提供有关如何通过PowerShell或任何其他命令行选项将证书上传到Azure DevOps的提示。
更新:
我尝试按照Hugh Lin - MSFT的描述从门户中的帖子中提取身份验证ID: Portal upload of new SSH Public Key 然后我提取了授权ID并将其添加到新帖子的有效负载中。 在发布之前,我还更改了displayName和Public data,使正文看起来像这样:
{
"contributionIds": ["ms.vss-token-web.personal-access-token-issue-session-token-provider"],
"dataProviderContext": {"properties": {
    "displayName": "AutoKey",
    "authorizationId": "48bef66f-798e-499b-94cc-720e48296bf7",
    "publicData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZA//Y+7vLd+P2F4WmIHpBPEMn/lPHPXrxHEJhhtnrNNZzgwIkWpgGQcuGQt2rmxEWYsSEV+CxTZcO7jig0yr8rsntUZJnCc86SVP22AfvE1rmRM/k+m6QRCBrSoHCAR+2ho/XoJ8iuZdvIV7qvV0Vk/N9rnf+KsJlK97RQWSc61rPl+7cUeXkBB8qsWOMeVxe9NhWH8DeWV+JG0nroTaZDrTq9BI5UDc7kqrRgwPCvqwT749C3k3cijxqEvK5bwWZ5NFaGj4CW8qRGXR5Sf6GJlQLgOrH+V2R7Ns5kLunD/Yy6RvSUiwokCyb3tDqBgB3W9lEtuxqcaYUwig0/GIF axel@me.com",       
    "scope": "app_token",
    "targetAccounts": ["67ebc765-c850-4d22-b95f-1d3553xxxxxx"],
    "isPublic": true,
    "sourcePage": {
        "url": "https://dev.azure.com/cloudeonwest/_usersSettings/keys",
        "routeId": "ms.vss-admin-web.user-admin-hub-route",
        "routeValues": {
            "adminPivot": "keys",
            "controller": "ContributedPage",
            "action": "Execute",
            "serviceHost": "67ebc765-c850-4d22-b95f-1d3553bxxxxxx (Org)"
        }
    }
}}
}

运行该请求后,displayName已更新,但publicData保持不变:
$answer.dataProviders.'ms.vss-token-web.personal-access-token-issue-session-token-provider'

clientId            : 00000000-0000-0000-0000-000000000000
accessId            : 52447de9-8c41-4d5b-bfdb-48b4eaxxxxxx
authorizationId     : 48bef66f-798e-499b-94cc-720e48296bf7
hostAuthorizationId : 00000000-0000-0000-0000-000000000000
userId              : 357d38ad-6712-69e1-adc3-be8caxxxxxx
validFrom           : 7/25/2020 3:26:51 PM
validTo             : 7/25/2025 3:26:51 PM
displayName         : AutoKey
scope               : app_token
targetAccounts      : {67ebc765-c850-4d22-b95f-1d3553xxxxxx}
token               :
alternateToken      :
isValid             : True
isPublic            : True
publicData          : BBBAB3NzaC1yc2EAAAADAQABAAABAQDZA//Y+7vLd+P2F4WmIHpBPEMn/lPHPXrxHEJhhtnrNNZzgwIkWpgGQcuGQt2rmxEWYsSEV+CxTZcO7jig0yr8rsntUZJnCc86SVP22AfvE1rmRM/k+m6QRCBrSoHCAR+2ho/XoJ8iuZdvIV7qvV0Vk/N9rnf+KsJlK97RQWSc61rPl+7cUeXkBB8qsWOMeVxe9NhWH8DeWV+JG0nroTaZDrTq9BI5UDc7kqrRgwPCvqwT749C3k3cijxqEvK5bwWZ5NFaGj4CW8qRGXR5Sf6GJlQLgOrH+V2R7Ns5kLunD/Yy6RvSUiwokCyb3tDqBgB3W9lEtuxqcaYUwig0/GIF
source              :
claims              :

门户网站也显然得到了更新: 在此输入图片描述


在之前的测试中,我只注意到名称已成功替换,但没有注意到关键数据是否被替换。经过测试,我可以重现您的问题,并且无法替换关键数据。因此,我认为Azure Devops目前不支持使用rest api上传ssh密钥。 - Hugh Lin
通过UI添加ssh密钥会更加方便。我已经更新了答案并为您提交了一个功能请求。很抱歉给您带来了错误的指导。 - Hugh Lin
1个回答

1
抱歉,目前Azure DevOps不支持通过REST API上传SSH密钥。官方文档也没有提供可以实现此功能的REST API。目前,我们只能通过UI添加公共SSH密钥。
除了否定答案外,我认为您的想法很好!因此,我在DC论坛上发布了一个功能请求here。您可以投票支持该建议并在那里分享您的评论。如果产品团队查看了该请求,他们将提供更新。感谢您帮助我们构建更好的Azure DevOps。

谢谢 Hugh。我真的想上传一个 SSH 密钥到 pipeline 账户,以便它可以向 Terraform 进行身份验证。我们是 Azure DevOps 中保存在单独存储库中的模块的重度用户。不幸的是,这些模块的源仅支持 SSH。我们需要一个许可证账户才能拥有此 SSH 密钥。 - Axel Andersen
以上投票是针对visualstudio.com的。这里是一个关于“Azure DevOps”的查询,请在那里投票! - KargWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接