无法使用 PAT 从 Azure DevOps 克隆 git

Posted

技术标签:

【中文标题】无法使用 PAT 从 Azure DevOps 克隆 git【英文标题】:Cannot clone git from Azure DevOps using PAT 【发布时间】:2019-04-05 23:43:12 【问题描述】:

我无法从 Azure DevOps 克隆简单的存储库。 操作系统:Ubuntu 18.10

我这样做:

开始使用 Azure DevOps 点击右上角我的用户名 转到安全选项卡 创建一个包含所有范围的 PAT(确保没有范围 问题) 将 PAT 复制到剪贴板 将 PAT 粘贴到其他位置以确认 PAT 已正确复制(我知道...不安全,但这超出了本问题的范围) 转到我的控制台 问题:git clone https://myorganization.visualstudio.com/myproject/_git/myrepo/ 我输入用户名和密码(PAT)

我不断收到来自 Git 的这条消息: fatal: Authentication failed for 'https://myorganization.visualstudio.com/myproject/_git/myrepo/'

我正在阅读其他人的解决方案,但没有一个对我有用。 我也试过这个:

以https://usename:token@myorganization.visualstudio.com/myproject/_git/myrepo/ 的形式传递令牌我真的很惊讶人们说这有效......因为我的 git 抱怨 因为相信 : 表示端口。 试图 激活/停用 git 的凭证管理器 * 在 Windows 和 Ubuntu。 已尝试激活和停用简单凭据。 尝试使用简单的凭据,即用户名 + 密码。 试图将我的用户名放入https://username@.... 尝试使用 SSH 尝试在 git 命令中使用 http.extraHeader,标头为
Authorization: Basic Base64Encoded(uname:PAT)
尝试在 git 命令中使用 http.extraHeader,标头为
Authorization: Bearer PAT
尝试使用 VSCode 客户端。它自己生成 PAT,但仍然无法进行身份验证和克隆。 尝试使用 Rider VSTS 客户端。它自己生成 PAT,但仍然无法进行身份验证和克隆。 尝试使用 Linux 的 git 凭据管理器。它提示代码,当我们在浏览器中进行身份验证时,它会成功生成 PAT。不过,在那之后无法进行身份验证。

任何线索为什么这不起作用?

【问题讨论】:

您是否尝试过使用 SSH 密钥认证? 您可以使用用户名(电子邮件)和密码(不是 PAT)进行克隆吗? 没有。我想使用 HTTPS。正如问题所述,是的,我尝试了用户名和密码,但结果相同。 【参考方案1】:

尝试: 首先从凭据管理器中删除 git 凭据。 尝试生成新的个人访问令牌来解决此错误

转到安全->个人访问令牌->添加 给出描述,选择所有范围,点击创建令牌。

复制令牌并将其存储以供以后使用。现在可以使用此令牌代替 git 用户的密码。

【讨论】:

你在这篇文章中提到的错误与我的问题完全无关。【参考方案2】:

我遇到了同样的问题,并花了很长时间寻找解决方案。我终于遇到了this post,其中包含Martinius79的cmets部分的解决方案。

简而言之,它需要通过 git http.extraheaders 传递用户名和 PAT,编码为 base64,才能对其进行身份验证。

100% 归功于原作者,只是将其包含在此处以帮助其他人找到它:

示例: git -c http.extraheader="授权:基本 TXlHaXRTeW5jVXNlcjo2bHFqNXJkcHEzdXBxZWVmd2o3bDduZXN5NTR3d3gxNHFobDVlanl5NTVkb2g0M3d4YzRh" 克隆 https://tfs.address/tfs/Collection/Project/_git/RepoName

使用的基本令牌 BASE64 编码:TXlHaXRTeW5jVXNlcjo2bHFqNXJkcHEzdXBxZWVmd2o3bDduZXN5NTR3d3gxNHFobDVlanl5NTVkb2g0M3d4YzRh

基本令牌 BASE64 解码:MyGitSyncUser:6lqj5rdpq3upqeefwj7l7nesy54wwx14qhl5ejyy55doh43wxc4a

令牌的构造来自: 在这个例子中: 虚构用户名:MyGitSyncUser 二手 PAT:6lqj5rdpq3upqeefwj7l7nesy54wwx14qhl5ejyy55doh43wxc4a

我希望这会有所帮助!

【讨论】:

真的很有前途。让我试试 这绝对是正确的答案。在使用普通 PAT(无需 Base64 编码)在 Windows 上成功测试后,我在 Ubuntu 上为此苦苦挣扎了一段时间。请注意,根据示例,您 需要 使用 base64 编码的用户名。试过没有,它不起作用。 对我来说这是行不通的。 IE。我得到与不设置 -c http.extraheader 相同的结果 我将此添加到我的 .bashrc 中:AZURE_PAT="<your PAT>"; AZURE_AUTH_HEADER=$(echo -n "anything:$AZURE_PATH" |base64 -w0); alias azure-git='git -c http.extraheader="AUTHORIZATION: Basic $AZURE_AUTH_HEADER"' 在 SO 上尝试了许多答案之后。这解决了我的问题。非常感谢!【参考方案3】:

我已经成功使用了这样的 PAT;

    为您的存储库复制克隆 URL,例如git clone https://<domain>.visualstudio.com/<domain>/_git/<domain> 复制后 PAT 用作;

git clone https://<PAT>@<domain>.visualstudio.com/<domain>/_git/<domain>

不需要用户名和密码,因为 PAT 就足够了。

【讨论】:

这行得通,但是我必须添加/替换 - 例如git clone https://@mydomain.visualstudio.com/myproject/_git/myrepo 是的,它也适用于 Mac OS Big Sur。在 VS Code 中的终端上运行命令。 这也适用于新的 dev.azure.com 地址。事实上,我可以开始工作的唯一风格。我的特殊情况:https://$(System.AccessToken)@dev.azure.com///_git/【参考方案4】:

这是 Ubuntu 18.10 附带的 curl 7.61.0 中的已知回归。回归在 curl 7.61.1 中得到修复,但 Ubuntu 18.10 还没有这个修复。查看(并点赞)https://bugs.launchpad.net/ubuntu/+source/curl/+bug/1805203

【讨论】:

【参考方案5】:

我遇到了同样的问题,只使用 HTTPS 解决了。

我发现我必须只使用终端,而不是使用 dev.azure 提供的任何“GUI 快捷方式”,因为它们适用于 git-credential-manager,它在 Windows 上运行良好,但在 Ubuntu 上已损坏。

显然,dev.azure git 存储库具有不同的凭据(您需要设置)而不是您的 Microsoft 帐户凭据。

假设我的 Microsoft 帐户用户名是 johndoe@outlook.com,密码为 Jd1986

如果您尝试进行 git 克隆,此凭证将起作用,因为您需要为您的项目生成 git 凭证然后使用它。

您可以从这里生成 git 凭证,

在此之后,保存并使用设置的凭据。

转到您的终端,并使用 git clone 的 HTTP url 并输入给定的凭据。这对我有用。

【讨论】:

这是 Azure DevOps -> Azure DevOps repo 导入的正确答案。我一直收到错误消息:克隆 URL 不正确。克隆 URL 需要授权。 你不需要这样做。您所需要的只是用于克隆。 accessToken 是 System.AccessToken $"git -c http.extraheader=\"AUTHORIZATION: bearer accessToken\" clone --depth 1 repo1.ProjectTargetUrl".BashOut();而 BashOut 只是一个辅助方法,可以使用转义字符转换为 bash 命令 如果你需要 creds 生成和 ssh cred 并将其应用到 mac。我认为这是非常不安全的替代凭证。你不应该使用它们,微软也明确表示不要使用它们。【参考方案6】:

Git http.extraheader & Bearer

YAML 风格的管道可以使用预设变量System.AccessToken。在检查了流水线开头的正式“结帐...”步骤后,我发现此步骤可以在我的脚本中使用:

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: 'git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" clone --depth 1 https://my-org@dev.azure.com/my-org/my-proj/_git/my-repo'

请注意,Azure DevOps job authorization scope 可能会影响这一点

【讨论】:

您可以在不需要 yaml 的情况下发出相同的命令。这是正确答案 一个警告,访问令牌不能推送,因为管道是只读的。【参考方案7】:

确保您是 Contributor 组的成员,并且您的 权限 不限于 azure repo 上的用户或组。

Azure Contributor 组默认具有克隆、获取和探索存储库内容的权限;此外,还可以创建、评论、投票和参与拉取请求。

Project Administrator Group 的成员或将 管理权限 设置为允许 Git 存储库(如 here 所述)的成员可以编辑任何此类权限。

如果您的组或用户没有克隆存储库的权限,您将得到问题描述的行为。

【讨论】:

请解释如何/为什么解决了所描述的问题。 什么都不回答【参考方案8】:

这个official guide procedure 为我工作,但有一点很重要。 base64编码时,一定要注意不可打印的字符。

指南说:

MY_PAT=yourPAT      # replace "yourPAT" with your actual PAT
B64_PAT=$(printf ":$MY_PAT" | base64)
git -c http.extraHeader="Authorization: Basic $B64_PAT" clone 
https://dev.azure.com/yourOrgName/yourProjectName/_git/yourRepoName

使用“echo”而不是“printf”会插入一个换行符,更改 base64 字符串(可能也适用于“echo -n”,但我没有尝试过)。 另外,不要包括用户名,如上面的 sn-p。

在 Ubuntu 18.04 上使用 git 2.17.1。

【讨论】:

这刚刚结束了为期 2 天的疯狂调试。谢谢!【参考方案9】:
    登录 Azure Dev Ops 门户。 转到您要克隆的项目。 从左侧菜单中选择 Repo。 点击右上角的克隆。 单击生成 Git 凭据 输入您要克隆存储库的给定 https 克隆 URL、用户名和密码。 你完成了!

【讨论】:

以上是关于无法使用 PAT 从 Azure DevOps 克隆 git的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 PAT 的情况下验证 Azure Devops Api 调用?

无法使用服务主体从发布管道访问 Azure Devops Git 存储库

Azure DevOps 项目管道无法从不同项目中的工件源访问 NuGet 包

Azure Devops 无法从计算机上的注册表中找到 Dac Framework (SqlPackage.exe) 的位置

如何在脚本中使用 system.accesstoken 创建 Azure Devops 服务连接

无法从部署中心为 Dotnet core 3.1 配置 CI 构建。有啥方法可以设置 CI Azure DevOps