如何通过SPN从Python连接到Azure Devops?

2cmtqfgy  于 2023-06-24  发布在  Python
关注(0)|答案(1)|浏览(87)

我有Python代码,它使用PAT令牌来授权Azure Devops。
在高级别上,Python文件从存储库中的位置提取头,通过PAT令牌向Azure Devops进行身份验证,并将这些头复制到Azure Devops Wiki。
我正在尝试使用Service Principal在Python和Azure Devops之间建立身份验证。
我有spn client_id、tenant_id和secret。使用上述凭证进行身份验证后,如何生成不记名令牌?
希望生成一个不记名令牌,我可以用它来代替我的PAT令牌。

b5lpy0ml

b5lpy0ml1#

我注册了一个Azure AD应用,并添加了DevOpsAPI权限,如下所示:

您需要使用委托流程,如授权码流程、用户名密码流程等...范围为**499b84ac-1321-427f-aa17-267ca6975798/.default**,用于生成Azure DevOps的承载令牌。

授权码流程:

最初我在浏览器中运行下面的授权请求,成功在地址栏中得到**code**值,如下所示:

https://login.microsoftonline.com/Tenant_Id/oauth2/v2.0/authorize
?client_id=Client_ID
&response_type=code
&redirect_uri=https://jwt.ms
&response_mode=query
&scope= 499b84ac-1321-427f-aa17-267ca6975798/.default
&state=12345

我运行下面的python代码来为Azure DevOps生成承载令牌,如下所示:

import urllib3
urllib3.disable_warnings()
uri = "https://login.microsoftonline.com/tenantID/oauth2/v2.0/token"
payload= {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Host': 'login.microsoftonline.com',
    'client_id': 'appID',
    'scope': '499b84ac-1321-427f-aa17-267ca6975798/.default',
    'client_secret': 'enter_secret',
    'grant_type': 'authorization_code',
    'code': 'paste_code_value_from_above_step',
    'redirect_uri':'https://jwt.ms'
}

http = urllib3.PoolManager()
response = http.request('POST', uri, payload)

print(response.data)

my_dict = eval(response.data)
token = my_dict['access_token']
print(token)

回复:

要确认这一点,您可以解码jwt.ms中的令牌,并检查**audscp**声明,如下所示:

要生成用户名密码流程的bearer token,可以使用下面的python代码:

import urllib3
urllib3.disable_warnings()
uri = "https://login.microsoftonline.com/tenantID/oauth2/v2.0/token"
payload= {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Host': 'login.microsoftonline.com',
    'client_id': 'appID',
    'scope': '499b84ac-1321-427f-aa17-267ca6975798/.default',
    'client_secret': 'secret',
    'grant_type': 'password',
    'username':'nmo@xxxxxxxxxx.onmicrosoft.com',
    'password':'xxxxxxxxxx'
}

http = urllib3.PoolManager()
response = http.request('POST', uri, payload)

print(response.data)

my_dict = eval(response.data)
token = my_dict['access_token']
print(token)

回复:

相关问题