无法使用PAT

时间:2018-11-01 17:41:19

标签: git authentication azure-devops token access-token

我无法从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和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。尽管如此,之后仍无法进行身份验证。

有什么线索为什么这行不通?

9 个答案:

答案 0 :(得分:4)

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

简而言之,需要通过git http.extraheaders传递编码为base64的用户名和PAT,以便进行身份验证。

100%归功于原始作者,只在此处添加它以帮助其他人找到它:

  

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

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

     

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

     

令牌是从构建的:   在此示例中:   虚构的用户名:MyGitSyncUser   二手PAT:6lqj5rdpq3upqeefwj7l7nesy54wwx14qhl5ejyy55doh43wxc4a

我希望这会有所帮助!

答案 1 :(得分:2)

我在使用PAT方面取得了成功;

  1. 复制存储库的克隆网址,例如git clone https://<domain>.visualstudio.com/<domain>/_git/<domain>
  2. 复制了PAT后,用作:

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

应输入用户名或密码,因为PAT足够。

答案 2 :(得分:1)

确保您是贡献者组的成员,并且您的权限不受限于天蓝色仓库中的用户或组。

Azure 参与者组默认具有克隆,获取和浏览存储库内容的权限;还可以创建,评论,投票并为拉取请求做出贡献。

Project Administrator Group的成员或将管理许可权设置为“ here”所述的“允许Git存储库”的成员都可以编辑此许可权。

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

答案 3 :(得分:0)

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

Error

转到安全->个人访问令牌->添加 输入描述,选择所有作用域,然后单击创建令牌。

PAT

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

Token

答案 4 :(得分:0)

这是curl 7.61.0中的已知回归,它随Ubuntu 18.10一起提供。回归已在curl 7.61.1中修复,但Ubuntu 18.10尚无此修复程序。查看(并投票)https://bugs.launchpad.net/ubuntu/+source/curl/+bug/1805203

答案 5 :(得分:0)

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

我发现我只需要使用终端,而不必使用dev.azure提供的任何“ GUI快捷方式”,因为它们是用于git-credential-manager的,它在Windows上可以正常运行,但对于Ubuntu却不可用。 >

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

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

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

您可以从此处生成git凭证, enter image description here

此后,保存并使用设置的凭据。 enter image description here

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

答案 6 :(得分:0)

Git http.extraheader&bearer

YAML样式管道可以使用预设变量System.AccessToken。在检查管道开头的正式“ Checkout ...”步骤之后,我发现此步骤可以在脚本中使用:

- 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可能会对此造成影响

答案 7 :(得分:0)

这个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”一起使用,但我没有尝试过)。 另外,按照上面的代码段,不要包含用户名。

在Ubuntu 18.04上使用git 2.17.1。

答案 8 :(得分:-1)

您需要对令牌进行Base64编码,并将其添加为HTTP授权标头。这可以通过OpenSSL完成:

PAT="enter-your-pat-here"
REPO_URL="https://myorg@dev.azure.com/myorg/myproject/_git/myrepo"

AUTH=$(echo -n ":$PAT" | openssl base64 | tr -d '\n')

git -c http.$REPO_URL.extraHeader="Authorization: Basic $AUTH" clone $REPO_URL

echo -n "..." | ... | tr -d '\n'是一种常见的Linux技巧,用于将字符串作为输入发送到通常需要用户输入的命令(尝试编写openssl base64,您将看到)。

请注意echo -n ":$PAT"中的前导“:”。这是因为缺少“用户”的常规格式为“用户:令牌”。

为避免在每个git命令中重新键入配置选项,您可以将授权标头添加到本地或全局git配置中:

git config --global http.$REPO_URL.extraHeader "Authorization: Basic $AUTH"

通过以下方式查看更改:

git config --global --edit