首页 > 编程语言 >使用python程序自动克隆Azure DevOps Server中的Git库(令牌pat认证)

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

时间:2023-01-06 19:23:52浏览次数:78  
标签:字符 Git pat python DevOps 认证 token Azure

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:[email protected]/......,这种方式是不能通过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 张洪君
在这里插入图片描述

标签:字符,Git,pat,python,DevOps,认证,token,Azure
From: https://www.cnblogs.com/danzhang/p/17031413.html

相关文章

  • 高校github课程资源汇总
    序号学校名称学校类型课程资源链接1清华大学Top计算机系课程攻略https://github.com/Salensoft/thu-cst-crackerhttps://github.com/PKUanonym/REKCARC-......
  • [记]python操作xml文件
    test.xml<A><AA><AAAname="aaa">AaA</AAA><BBB></BBB></AA><BB><CCCname="ccc">CcC</CCC><DDD></DDD></BB&g......
  • 如何发现Python依赖库漏洞
    因为python编程的流行,python的各种库也越来越多,但许多小伙伴可能只注意到了自己编程所要依赖的环境,但是却忽略了库的版本也有可能存在漏洞的风险,如果不及时检查和更新python......
  • GitHub简易讲解
    这是你首先要在自己的电脑上需要配置的参数,然后把id_rsa.pub中的内容全部复制到你的ssh帐号中建立githubgitconfig--globaluser.name"user"gitconfig--globaluser.em......
  • python 之复数
    #_*_coding:utf-8_*_#python2.7aa=123-12jprintaa.real#output实数部分123.0printaa.imag#output虚数部分-12.0#python3aa=123-12jprint(aa.real)print(aa.imag) ......
  • python之除法获取真实的结果
    #_*_coding:utf-8_*_from__future__importdivisiona=2b=5print(a/b)#output0.4主要是导入future模块......
  • python 序列类型的操作符
    #_*_coding:utf-8_*_a='abs'printa[0]printa[0:2]printa*4printa+'北京'print'a'inaprint'a'notina#a#ab#absabsabsabs#abs北京#True#False......
  • 类似git 的数据版本管理工具
    git是一个很不错的svc系统,当前基于git的玩法是越来越多了,比如gitops,基于git的数据管理也是包含了不少的开源实现基于git玩法的好处版本化,可以实现特定版本的只读活......
  • Python中的main方法教程
    估计很多人跟我一样初学python看代码的时候先找一下main()方法,从main往下看。但事实上python中是没有你理解中的“main()”方法的。言归正传ifname=="main":可以看成......
  • Python 函数递归教程
    1.什么是函数递归函数的嵌套调用:一个函数里面又写了一个函数。函数的递归调用:他是一种特殊的嵌套调用,他也是在函数里面调用函数,但是他在函数体内调用的函数时他自己本身......