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/danzhangAzure DevOps MVP 张洪君

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: