/ / Conecte-se ao repositório github privado com libgit2 - macos, authentication, github, ssh, libgit2

Conecte-se ao repositório github privado com libgit2 - macos, authentication, github, ssh, libgit2

Eu estou tentando buscar um repositório github privado usando libgit2. O repositório pertence a uma organização e eu tenho permissões de leitura / gravação. O programa está escrito em Objective-C ++. Eu tenho isso:

- (int)fetchBranches
{
git_remote *remote = NULL;
int result = 0;
if (!(result = git_remote_load(&remote, repo, "origin"))) {
git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT;
callbacks.credentials = cred_acquire_cb;
git_remote_set_callbacks(remote, &callbacks);
result = git_remote_fetch(remote);
}
return result;
}

int cred_acquire_cb(git_cred **out,
const char * url,
const char * username_from_url,
unsigned int allowed_types,
void * payload)
{
return git_cred_ssh_key_new(out, "GITHUBUSERNAME", "/Users/admin/.ssh/id_rsa.pub", "/Users/admin/.ssh/id_rsa", "PASSPHRASE");
}

Isso cria as credenciais, mas quando eu faço a busca, ele falha ao tentar autenticar a sessão com libssh2. (libgit2 / src / transports / ssh.c: 302):

rc = libssh2_userauth_publickey_fromfile(
session, c->username, c->publickey,
c->privatekey, c->passphrase);

O erro é -18,LIBSSH2_ERROR_AUTHENTICATION_FAILED. Eu confirmei que a chave pública foi adicionada ao Github e tentei alterá-la para uma nova também. Também a senha está correta e o nome de usuário é meu nome de usuário do github. Também posso fazer a busca através do console. :

[remote "origin"]
url = git@github.com:ORGNAME/REPONAME.git
fetch = +refs/heads/*:refs/remotes/origin/*

Eu também tentei obter a chave do git-agent no OSX com o mesmo resultado:

return git_cred_ssh_key_from_agent(out, "GITHUBUSERNAME");

Finalmente eu tentei usar a autenticação de texto simples:

return git_cred_userpass_plaintext_new(out, username, password);

Este último método funciona depois de mudar o repoURL para o endereço HTTPS. O problema é que requer que o usuário insira a senha a cada vez ou armazene a estrutura git_cred que contém a senha em branco (não goste disso).

Alguém sabe por que a autenticação do ssh está falhando? Existe uma maneira de evitar a necessidade de inserir o nome de usuário / senha em cada operação (com a autenticação de texto simples)?

Respostas:

7 para resposta № 1

O usuário ao falar sobre o ssh é "git" (assim todos os urls são git@github.com:user/repo), então você deve usar isso em vez do nome de usuário "real" no GitHub. A chave que você envia é o que o servidor usa para determinar com qual usuário está lidando.