使用python程序自动克隆Azure DevOps Server中的Git库(令牌pat认证)

Contents

  • 1. 场景描述
  • 2. 操作方法
    • 2.1 调用Azure DevOps的接口生成令牌
    • 2.2 生成Base64编码格式的认证字符
    • 2.3 在git命令行中使用base64字符作为认证字符


1. 场景描述

在最近的一次项目实施过程中,客户提出这样的一个需求,希望使用自己编写的程序(python),从Azure DevOps Server的服务器中克隆指定的Git库,并实现其他的例如签入和拉取等与服务器之间的交互操作,并且希望所有的操作可以基于计算机中安装的Git客户端工具。

我们知道使用Git clone命令的时候,工具会提示用户输入账户和密码,如果我们在Git URL中输入账户和密码,例如http://username:password@devops.server.com/......,这种方式是不能通过Git客户端的认证的。在调研和验证之后,我们发现使用令牌可以实现自动认证的功能,下面就为大家分享一下使用令牌实现Git认证的方法。

2. 操作方法

2.1 调用Azure DevOps的接口生成令牌

首先,我们使用程序自动调用Azure DevOps Server生成令牌的接口,自动生成令牌。下面是Python调用接口的示例脚本:

import requests
import json

url = "http://dev.my-server.com:8080/tfs/Collection/_apis/Contribution/HierarchyQuery?api-version=5.0-preview"

payload = json.dumps({
  "contributionIds": [
    "ms.vss-token-web.personal-access-token-issue-session-token-provider"
  ],
  "dataProviderContext": {
    "properties": {
      "displayName": "api-token22",
      "validTo": "2023-02-05T09:00:13.599Z",
      "scope": "app_token"
    }
  }
})
headers = {
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

注意,使用Python调用Azure DevOps 的接口时,需要使用basic认证方式,并填写用户的账户、密码和域名称,下图是postman中的配置示例:

image


调用接口后,Azure DevOps Server会返回下面的示例接口,其中的token值就是系统生成的令牌字符:

{
    "dataProviderSharedData": {},
    "dataProviders": {
        "ms.vss-web.component-data": {},
        "ms.vss-web.shared-data": null,
        "ms.vss-token-web.personal-access-token-issue-session-token-provider": {
            "clientId": "99999999-9999-9999-9999-999999999999",
            "accessId": "6618be25-ae55-4bc2-892c-d6b185610e67",
            "authorizationId": "e9420967-6060-41ba-85dc-6b48b6cd8711",
            "hostAuthorizationId": "00000000-0000-0000-0000-000000000000",
            "userId": "dbbcd236-2e2f-4fbb-8fcc-8b9fc70950a1",
            "validFrom": "2023-01-06T09:06:37.43Z",
            "validTo": "2023-02-05T09:00:13.6Z",
            "displayName": "api-token22",
            "scope": "app_token",
            "targetAccounts": null,
            "token": "cmctw7v74q3za2vnbuomiqnqljoicyv7pyismjbca2wosdhcoipa",
            "alternateToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImpRcy1qWVZzd1FPaWZFZGEwcVFEME9GRnF0MCJ9.eyJuYW1laWQiOiJkYmJjZDIzNi0yZTJmLTRmYmItOGZjYy04YjlmYzcwOTUwYTEiLCJzY3AiOiJhcHBfdG9rZW4iLCJhdWkiOiJlOTQyMDk2Ny02MDYwLTQxYmEtODVkYy02YjQ4YjZjZDg3MTEiLCJzaWQiOiI2NjE4YmUyNS1hZTU1LTRiYzItODkyYy1kNmIxODU2MTBlNjciLCJpc3MiOiJjZTBkZGMzNy01OWI1LTRiMjItYjFjNy0wZGYwMmIyYjg4YTQiLCJhdWQiOiJjZTBkZGMzNy01OWI1LTRiMjItYjFjNy0wZGYwMmIyYjg4YTQiLCJuYmYiOjE2NzI5OTU5OTcsImV4cCI6MTY3NTU4NzYxNH0.UO5xkffdO50rskEQQ4EhDql3NB-QSyQBwsG9xfgTJ5toifj0FUWaGfHVjufimCh2iRbRTOLBN-zMadkeLcWzCXx0gtx3r5NqEQtudoMKBDUTqJ8wVIyMrCdeVOYlaXWm4gqChw19CyhvC9PKsCH_nNfoZNVh_p6uhjQnE21Sd68CxEwe75mUrUR_noz0U-zs75b_babiL19T40asTQSImDx33AdmOIcotc9xrvgBMXmZhUxvxCno-PQ_ypgExpYw3ld33y6rW4ossVXwc81WSMerOYnpKkvsx98Ssfzw9jduGzIXBvBwGKwzu-c-dyS-nv3gNLkv1tgcGQj721owvg",
            "isValid": true,
            "isPublic": false,
            "publicData": "",
            "source": null,
            "claims": null
        }
    }
}

2.2 生成Base64编码格式的认证字符

在Git命令中使用basic方式实现认证,必须使用Base64格式的认证字符。我们需要将字符”pat:"和令牌连接后,在对连接后的字符按照base64格式进行编码,获取编码后的新的认证字符,例如:

  • 编码前的组合字符示例:pat:xsmgszi6xqvstso66llhjavfrdrpquws6tovrae3p7sn3bsmujya
  • 编码后的Base64字符示例:cGF0OnhzbWdzemk2eHF2c3RzbzY2bGxoamF2ZnJkcnBxdXdzNnRvdnJhZTNwN3NuM2JzbXVqeWE=

如果自己使用命令进行手动验证,可以不需要python代码编码,直接在互联网中找一个在线编码的网站即可,例如 https://www.base64encode.org/

2.3 在git命令行中使用base64字符作为认证字符

获取到上面的Base64格式的认证字符后,我们就可以使用Git中的-c(configuration)参数,将认证字符传送给Azure DevOps Server服务器,例如:
示例如下:

git -c http.extraheader="AUTHORIZATION: Basic cGF0OmNtY3R3N3Y3NHEzemEydm5idW9taXFucWxqb2ljeXY3cHlpc21qYmNhMndvc2RoY29pcGE="  clone http://dev.my-server.com:8080/tfs/Collection/team/_git/repo-name

注意,上面命令行中basic后面的字符是编码64字符

执行上面的代码后,我们可以看到代码库已经正常的克隆到了本地计算机。
实际上,处理克隆的操作之外,所有需要与服务器进行交互的操作,我们都可以使用上面的认证字符来实现。


如果需要了解更新详细的功能,你还可以从微软Azure DevOps Server 的在线文档,查询更多的权威资料,也欢迎通过下面的联系方式与我沟通,相互学习,相互提高!


https://www.cnblogs.com/danzhang
Azure DevOps MVP 张洪君
在这里插入图片描述

posted on 2023-01-06 19:11  danzhang  阅读(382)  评论(0编辑  收藏  举报

导航