J'essaie d'extraire un référentiel privé github à l'aide de libgit2. Le référentiel appartient à une organisation et je dispose d'autorisations de lecture / écriture. Le programme est écrit en Objective-C ++. J'ai ceci:
- (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");
}
Cela crée les informations d'identification, mais lorsque je le récupère, il échoue lors de la tentative d'authentification de la session avec libssh2. (libgit2 / src / transports / ssh.c: 302):
rc = libssh2_userauth_publickey_fromfile(
session, c->username, c->publickey,
c->privatekey, c->passphrase);
L'erreur est -18,LIBSSH2_ERROR_AUTHENTICATION_FAILED. J'ai confirmé que la clé publique est ajoutée à Github et essayé de la remplacer par une nouvelle. De plus, la phrase secrète est correcte et le nom d'utilisateur est mon nom d'utilisateur github. :
[remote "origin"]
url = git@github.com:ORGNAME/REPONAME.git
fetch = +refs/heads/*:refs/remotes/origin/*
J'ai également essayé d'obtenir la clé de git-agent sous OSX avec le même résultat:
return git_cred_ssh_key_from_agent(out, "GITHUBUSERNAME");
Enfin, j'ai essayé d'utiliser l'authentification en texte brut:
return git_cred_userpass_plaintext_new(out, username, password);
Cette dernière méthode fonctionne après avoir changé le repoURL à l'adresse HTTPS. Le problème est qu’il faut que l’utilisateur saisisse le mot de passe à chaque fois ou stocke la structure git_cred qui contient le mot de passe en blanc (ne ressemble pas à ça).
Quelqu'un sait pourquoi l'authentification SSH échoue? Existe-t-il un moyen d’éviter de saisir le nom d’utilisateur / mot de passe à chaque opération (avec l’authentification en texte brut)?
Réponses:
7 pour la réponse № 1L’utilisateur qui parle ssh est "git" (ainsi toutes les URL sont git@github.com:user/repo
), vous devriez donc utiliser cela à la place du "vrai" nom d'utilisateur sur GitHub. La clé que vous envoyez est ce que le serveur utilise pour déterminer l’utilisateur auquel il s’adresse.