使用令牌向GitHub进行身份验证


118

我正在尝试使用个人访问令牌向GitHub进行身份验证。在github上的帮助文件中,它声明使用cURL方法进行身份验证(https://help.github.com/articles/creating-an-access-token-for-command-line-use)。我已经尝试过了,但是我仍然无法推送到GitHub。请注意,我试图从未经身份验证的服务器(Travis-CI)进行推送。

cd $HOME
git config --global user.email "emailaddress@yahoo.com"
git config --global user.name "username"

curl -u "username:<MYTOKEN>" https://github.com/username/ol3-1.git
git clone --branch=gh-pages https://github.com/username/ol3-1.git gh-pages

cd gh-pages
mkdir buildtest
cd buildtest
touch asdf.asdf

git add -f .
git commit -m "Travis build $TRAVIS_BUILD_NUMBER pushed to gh-pages"
git push -fq origin gh-pages

此代码导致错误:

remote:对scuzzlebuzzle / ol3-1.git的匿名访问被拒绝。

致命:“ https://github.com/scuzzlebuzzle/ol3-1.git/ ”的身份验证失败

Answers:


191

您的curl命令是完全错误的。您应该使用以下内容

curl -H 'Authorization: token <MYTOKEN>' ...

除此之外,如果它实际上是私有的,那也不会授权您的计算机克隆存储库。(但是,看看它表示不是。)通常,您需要执行以下操作:

git clone https://scuzzlebuzzle:<MYTOKEN>@github.com/scuzzlebuzzle/ol3-1.git --branch=gh-pages gh-pages

这样会将您的凭据添加到克隆存储库时创建的远程目录中。但是不幸的是,您无法控制Travis如何克隆您的存储库,因此您必须像这样编辑遥控器。

# After cloning
cd gh-pages
git remote set-url origin https://scuzzlebuzzle:<MYTOKEN>@github.com/scuzzlebuzzle/ol3-1.git

这将使您的项目修复为使用内置凭据的遥控器。

警告:令牌具有读/写访问权限,应像对待密码一样对待。如果您在克隆或添加遥控器时在克隆URL中输入令牌,Git writes it to your .git/config file in plain text, which is a security risk.


非常感谢你的帮助。效果很好。这是我更改后的文件的副本:github.com/scuzzlebuzzle/ol3-1/blob/master/util/s.sh。我很接近。由于某种原因,它没有推送到我创建的build1目录,但仍然推送到了build目录,因此可以正常工作!谢谢!
wayofthefuture 2013年

1
我不知道您在说什么编辑器按钮,但是绝对有必要删除原始遥控器。
伊恩·斯塔普尔顿

1
嘿。凉。乐意效劳。
伊恩·斯塔普尔顿

4
您不必rm遥控器,而可以使用set-url,例如git remote set-url origin https://scuzzlebuzzle:<MYTOKEN>@github.com/scuzzlebuzzle/ol3-1.git
berkus

1
不安全的方法。按键很容易导致登录错误。而是使用范围狭窄的部署密钥。
约瑟夫·拉斯特

53

首先,您需要创建一个个人访问令牌(PAT)。这在这里描述:https : //help.github.com/articles/creating-an-access-token-for-command-line-use/

可笑的是,本文告诉您如何创建它,但是绝对不提供如何处理它的线索。经过大约一个小时的拖延文档和Stack Overflow,我终于找到了答案:

$ git clone https://github.com/user-or-organisation/myrepo.git
Username: <my-username>
Password: <my-personal-access-token>

实际上,当我在远程工作并且仍在本地进行更改时,我被公司政策强制启用两因素身份验证,因此实际上clone我不是必需的,而是push。我在很多地方都需要删除和重新创建遥控器,但实际上我的常规push命令与clone上述命令完全一样,并且遥控器没有变化:

$ git push https://github.com/user-or-organisation/myrepo.git
Username: <my-username>
Password: <my-personal-access-token>

(@YMHuang通过文档链接使我处在正确的轨道上。)


为此,我也面临着同样的任务
Surya Prakash Patel

很好。
Samim Aftab Ahmed

我尝试过几次这种方法,但是我面临着同样的问题。我生成了PTA,然后在执行推命令后尝试进行身份验证,并输入了用户名和令牌。它仍然告诉我凭证是错误的。这些步骤中我缺少什么?
johnny_kb

30

为了避免交出“城堡的钥匙” ...

请注意,sigmavirus24的响应要求您给Travis一个具有相当广泛权限的令牌-因为GitHub仅提供具有广泛范围的令牌,例如“写入我的所有公共仓库”或“写入我的所有私人仓库”。

如果您想收紧访问权限(还有更多工作!),可以将GitHub部署密钥与Travis加密的yaml字段结合使用。

这是该技术原理的草图 ...

首先生成一个RSA部署密钥(通过ssh-keygenmy_key,并将其作为部署密钥添加到您的github存储库设置中。

然后...

$ password=`openssl rand -hex 32`
$ cat my_key | openssl aes-256-cbc -k "$password" -a  > my_key.enc
$ travis encrypt --add password=$password -r my-github-user/my-repo

然后$password,通过添加到yaml文件,使用该文件在集成时解密您的部署密钥:

before_script: 
  - openssl aes-256-cbc -k "$password" -d -a -in my_key.enc -out my_deploy_key
  - echo -e "Host github.com\n  IdentityFile /path/to/my_deploy_key" > ~/.ssh/config
  - echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" > ~/.ssh/known_hosts

注意:最后一行预填充了github的RSA密钥,从而避免了在连接时手动接受的需求。


30

带有OAuth令牌的自动化/ Git自动化

$ git clone https://github.com/username/repo.git
  Username: your_token
  Password:

它也可以在git push命令中使用。

参考:https : //help.github.com/articles/git-automation-with-oauth-tokens/


4
关键是设置git,这样就不需要始终提示您输入令牌,如此处所述-help.github.com/articles/caching-your-github-password-in-git 对该问题的其他答案最终会将您的令牌以纯文本格式写入.git / config,这可能会带来安全风险。
杰罗姆

很好的参考-TX!
dalcam '16

非常感谢https:// <mytoken> @mygiturl在我的.git \ config中工作过
泰思

22

这对我使用ssh起作用:

设置开发人员设置生成新令牌

git remote set-url origin https://[APPLICATION]:[NEW TOKEN]@github.com/[ORGANISATION]/[REPO].git

2
这也适用于使用以下格式的个人访问令牌:git remote add origin https://[USERNAME]:[NEW TOKEN]@github.com/[USERNAME]/[REPO].git
CommandZ

我必须做git remote add origin https://[USERNAME]:[TOKEN]@git.mycompany.com/[ORGANIZATION]/[REPO].git
pacoverflow '19

这不是一个坏主意吗?令牌不会缓存在控制台历史记录中吗?
TheRealChx101

git remote add origin https:// [TOKEN] @ git.mycompany.com / [ORGANIZATION] / [REPO] .git
Thomas Chafiol

@ TheRealChx101您可以使用类似的方法git remote set-url origin https://[TOKEN]@git.mycompany.com/[ORGANIZATION]/[REPO].git> /dev/null 2>&1来避免记录不安全的git输出。将令牌存储在变量中,以避免将其存储在日志中。但是它需要存储在某个地方。为了进一步确保安全,您可以将其加密存储。例如,Travis CI支持此方法。
kap

3

通常我会这样

 git push https://$(git_token)@github.com/user_name/repo_name.git

git_token正在从Azure devops中的变量config中读取。

你可以在这里阅读我的完整博客


1

由于在ORG / REPO部分中花了整整一天的硬编码到我们的构建脚本中来解决这个问题,因此遇到了可怕的“找不到远程”错误,最终找到了一个可行的解决方案是使用TRAVIS_REPO_SLUG。立即将其切换为硬编码属性即可。

git remote set-url origin https://[ORG]:${TOKEN}@github.com/${TRAVIS_REPO_SLUG}

0

通过花很多时间努力使用GitHub令牌,最终它的工作原理如下:

$ cf_export GITHUB_TOKEN=$(codefresh get context github --decrypt -o yaml | yq -y .spec.data.auth.password)

  • 代码遵循Codefresh关于使用令牌克隆存储库的指南(freestyle}
  • 进行测试:在匹配字上填入sed %d%H%M'-123456-whatever'
  • 推回仓库(这是私人仓库
  • DockerHub webhooks触发

以下是完整的代码:

version: '1.0'
steps:
  get_git_token:
    title: Reading Github token
    image: codefresh/cli
    commands:
      - cf_export GITHUB_TOKEN=$(codefresh get context github --decrypt -o yaml | yq -y .spec.data.auth.password)
  main_clone:
    title: Updating the repo
    image: alpine/git:latest
    commands:
      - git clone https://chetabahana:$GITHUB_TOKEN@github.com/chetabahana/compose.git
      - cd compose && git remote rm origin
      - git config --global user.name "chetabahana"
      - git config --global user.email "chetabahana@gmail.com"
      - git remote add origin https://chetabahana:$GITHUB_TOKEN@github.com/chetabahana/compose.git
      - sed -i "s/-[0-9]\{1,\}-\([a-zA-Z0-9_]*\)'/-`date +%d%H%M`-whatever'/g" cloudbuild.yaml
      - git status && git add . && git commit -m "fresh commit" && git push -u origin master

输出...

On branch master 
Changes not staged for commit: 
  (use "git add ..." to update what will be committed) 
  (use "git checkout -- ..." to discard changes in working directory) 

modified:   cloudbuild.yaml 

no changes added to commit (use "git add" and/or "git commit -a") 
[master dbab20f] fresh commit 
 1 file changed, 1 insertion(+), 1 deletion(-) 
Enumerating objects: 5, done. 
Counting objects:  20% (1/5) ...  Counting objects: 100% (5/5), done. 
Delta compression using up to 4 threads 
Compressing objects:  33% (1/3) ... Writing objects: 100% (3/3), 283 bytes | 283.00 KiB/s, done. 
Total 3 (delta 2), reused 0 (delta 0) 
remote: Resolving deltas:   0% (0/2)  ...   (2/2), completed with 2 local objects. 
To https://github.com/chetabahana/compose.git 
   bbb6d2f..dbab20f  master -> master 
Branch 'master' set up to track remote branch 'master' from 'origin'. 
Reading environment variable exporting file contents. 
Successfully ran freestyle step: Cloning the repo 


0

如果您使用的是GitHub Enterprise,并且克隆存储库或推送会给您403错误,而不是提示输入用户名/令牌,则可以使用以下命令:

  1. 删除仓库
  2. 打开命令提示符,然后导航到您想要存储库的文件夹
  3. 类型:
git clone https://[USERNAME]:[TOKEN]@[GIT_ENTERPRISE_DOMAIN]/[ORGANIZATION]/[REPO].git
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.