使用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中的配置示例:
调用接口后,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 张洪君