Autenticar com GitHub usando um token


118

Estou tentando me autenticar no GitHub usando um token de acesso pessoal. Nos arquivos de ajuda do github, ele afirma usar o método cURL para autenticar ( https://help.github.com/articles/creating-an-access-token-for-command-line-use ). Eu tentei isso, mas ainda não consigo enviar para o GitHub. Observe, estou tentando enviar de um servidor não autenticado (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

Este código causa os erros:

remoto: acesso anônimo a scuzzlebuzzle / ol3-1.git negado.

fatal: Falha na autenticação de ' https://github.com/scuzzlebuzzle/ol3-1.git/ ' "

Respostas:


192

Seu curlcomando está totalmente errado. Você deve usar o seguinte

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

Deixando isso de lado, isso não autoriza seu computador a clonar o repositório se de fato ele for privado. (Uma olhada, no entanto, indica que não.) O que você normalmente faria é o seguinte:

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

Isso adicionará suas credenciais ao controle remoto criado ao clonar o repositório. Infelizmente, no entanto, você não tem controle sobre como o Travis clona seu repositório, então você tem que editar o remoto dessa forma.

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

Isso corrigirá seu projeto para usar um controle remoto com credenciais integradas.

Aviso: os tokens têm acesso de leitura / gravação e devem ser tratados como senhas. Se você inserir seu token no URL clone ao clonar ou adicionar um controle remoto,Git writes it to your .git/config file in plain text, which is a security risk.


Muito obrigado pela sua ajuda. Funcionou muito bem. Aqui está uma cópia do meu arquivo alterado: github.com/scuzzlebuzzle/ol3-1/blob/master/util/s.sh . Eu cheguei bem perto. Por algum motivo, ele não foi enviado para o diretório build1 que eu criei, mas ainda assim foi enviado para o diretório build, então funcionou! OBRIGADO!
caminho do futuro,

1
Não sei de qual botão do editor você está falando, mas remover o controle remoto original é absolutamente necessário.
Ian Stapleton Cordasco

1
Heh. Legal. Feliz em ajudar.
Ian Stapleton Cordasco

4
Você não precisa rm o controle remoto, você pode usar set-url, como emgit remote set-url origin https://scuzzlebuzzle:<MYTOKEN>@github.com/scuzzlebuzzle/ol3-1.git
berkus

1
Abordagem insegura. Chave facilmente atribuída a registros de erro. Em vez disso, use uma chave de implantação com escopo restrito.
Joseph Lust

53

Primeiro, você precisa criar um token de acesso pessoal (PAT). Isso é descrito aqui: https://help.github.com/articles/creating-an-access-token-for-command-line-use/

Risivelmente, o artigo explica como criá-lo, mas não dá absolutamente nenhuma pista do que fazer com ele. Após cerca de uma hora de documentação sobre pesca de arrasto e Stack Overflow, finalmente encontrei a resposta:

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

Na verdade fui forçado a habilitar a autenticação de dois fatores pela política da empresa enquanto estava trabalhando remotamente e ainda tinha alterações locais, então na verdade não era clonenecessário, mas push. Li em muitos lugares que precisava excluir e recriar o controle remoto, mas na verdade meu pushcomando normal funcionou exatamente da mesma forma que o cloneanterior e o controle remoto não mudou:

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

(@YMHuang me colocou no caminho certo com o link de documentação.)


Obrigado por isso, eu também estava enfrentando a mesma tarefa
Surya Prakash Patel

perfeitamente bem.
Samim Aftab Ahmed

Tentei várias vezes essa abordagem, mas estou enfrentando o mesmo problema. Eu gerei o PTA e tentei autenticar após a execução do comando push, colocando meu nome de usuário e meu token. Ainda me diz que as credenciais estão erradas. O que estou perdendo nessas etapas?
johnny_kb

30

Para evitar entregar "as chaves do castelo" ...

Observe que a resposta do sigmavirus24 requer que você dê ao Travis um token com permissões bastante amplas - já que o GitHub só oferece tokens com escopos amplos como "escrever todos os meus repositórios públicos" ou "gravar todos os meus repositórios privados".

Se você quiser restringir o acesso (com um pouco mais de trabalho!), Você pode usar as chaves de implantação do GitHub combinadas com os campos yaml criptografados do Travis.

Aqui está um esboço de como a técnica funciona ...

Primeiro, gere uma chave de implantação RSA (via ssh-keygen) chamada my_keye adicione-a como uma chave de implantação nas configurações de repo do github.

Então...

$ 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

Em seguida, use o $passwordarquivo para descriptografar sua chave de implantação no momento da integração, adicionando ao seu arquivo 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

Nota: a última linha preenche previamente a chave RSA do github, o que evita a necessidade de aceitar manualmente no momento de uma conexão.


30

Automação / automação Git com tokens OAuth

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

Também funciona no git pushcomando.

Referência: https://help.github.com/articles/git-automation-with-oauth-tokens/


4
A chave é definir o git para que você não precise ser solicitado o tempo todo pelo seu token, conforme descrito aqui - help.github.com/articles/caching-your-github-password-in-git Outras respostas a esta pergunta acabará gravando seu token em texto simples em .git / config, o que pode ser considerado um risco de segurança.
jerome,

ótima referência - txs!
dalcam

adorável obrigado https: // <mytoken> @mygiturl funcionou muito bem no meu .git \ config
Tyeth

22

Isso funcionou para mim usando ssh :

ConfiguraçõesConfigurações do desenvolvedorGerar novo token .

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

2
Isso também funciona para tokens de acesso pessoal usando este formato:git remote add origin https://[USERNAME]:[NEW TOKEN]@github.com/[USERNAME]/[REPO].git
CommandZ

Eu tive que fazergit remote add origin https://[USERNAME]:[TOKEN]@git.mycompany.com/[ORGANIZATION]/[REPO].git
pacoverflow

Não é uma má ideia? O token não será armazenado em cache no histórico do console?
TheRealChx101

Também funcionou para mim git remote add origin https: // [TOKEN] @ git.mycompany.com / [ORGANIZATION] / [REPO] .git
Thomas Chafiol

@ TheRealChx101Você pode usar algo como git remote set-url origin https://[TOKEN]@git.mycompany.com/[ORGANIZATION]/[REPO].git> /dev/null 2>&1para evitar o registro de saída git insegura. Armazene o token em uma variável para evitar que ele seja registrado. Mas ele precisa ser armazenado em algum lugar. Para garantir ainda mais, você pode armazená-lo criptografado. Esta abordagem é, por exemplo, suportada pelo Travis CI.
kap

3

Normalmente eu gosto disso

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

O git_token está lendo a partir da configuração da variável no azure devops.

Você pode ler meu blog completo aqui


1

Tendo lutado com esse problema por quase um dia inteiro de codificação na seção ORG / REPO em nosso script de compilação obtendo o temido erro 'remoto não encontrado', eventualmente encontrei uma solução de trabalho para usar o TRAVIS_REPO_SLUG. Trocar isso para os atributos codificados funcionou imediatamente.

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

0

Por ter lutado por tantas horas na aplicação do token GitHub, finalmente funciona como abaixo:

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

  • o código segue as orientações do Codefresh sobre a clonagem de um repo usando token (freestyle}
  • teste realizado: sed %d%H%M na palavra de correspondência'-123456-whatever'
  • empurrar de volta para o repo (que é um repo privado )
  • acionado por webhooks DockerHub

A seguir está o código completo:

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

Resultado...

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

Se você estiver usando o GitHub Enterprise e clonar o repo ou enviar um erro 403 em vez de solicitar um nome de usuário / token, você pode usar isto:

  1. Exclua o repo
  2. Abra o prompt de comando e navegue até a pasta em que deseja colocar o repositório
  3. Tipo:
git clone https://[USERNAME]:[TOKEN]@[GIT_ENTERPRISE_DOMAIN]/[ORGANIZATION]/[REPO].git
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.