Bonjour,
Avant toute chose, qu'entends-tu ici par « Personal Access Token » ? Est-ce que ce jeton se résume au final à un simple mot de passe ou s'agit-il d'un truc variable style RSA SecureID ? Dans ce dernier cas, tu risques d'avoir effectivement besoin de mettre en place une clé, mais ce qui suit reste bon à prendre pour travailler avec les autres dépôts, spécialement s'ils sont publics.
C'est effectivement un problème, parce que c'est la solution vers laquelle on renvoie systématiquement les gens, spécialement sur StackOverflow, et ce n'est pas la première approche à suivre avec Git car ce sont deux choses différentes.
- L'authentification de confiance avec ssh en général ;
- L'authentification de confiance avec git en particulier.
L'idée est que pour faire ses transferts, Git n'a en fait besoin que de « voir » le système de fichier distant. De là, trois possibilités : soit le protocole « git:// » (nécessite le lancement d'un dæmon serveur), soit le « http:// » (suffisant pour redescendre des fichiers et même pour en envoyer avec PUT, utilisée par défaut sur les forges logicielles publiques), soit le bon vieux SSH, utilisé par Git pour se connecter à un dépôt distant s'il ne peut pas le voir directement en local.
Or, quand on travaille avec SSH avec plusieurs machines (réelles ou VM), on a souvent le même problème : obligation de re-saisir le même mot de passe des dizaines de fois durant une session de travail. Sauf que dans « ssh — Secure SHell », il y a « secure » et qu'il est par nature intransigeant sur la sécurité (beaucoup plus que rsh ou uucp). Par exemple, il n'est pas possible de passer un mot de passe en tant qu'option sur la ligne de commande de ssh ou scp, ce qui au passage rend impossible l'utilisation de scripts avec ces commandes et cette seule méthode d'authentification. Si un mot de passe est demandé, il le sera de façon interactive avec l'utilisateur depuis le terminal.
En conséquence, toujours avec SSH, lorsque l'on est amené à naviguer fréquemment d'un shell à l'autre, on met en place une infrastructure basée soit sur une API reconnue telle que GSSAPI ou des choses comme PAM, soit avec une infrastructure à clés publiques. En général, ces clés sont ensuite placés dans un trousseau au niveau du système et sont déverrouillées en une fois avec un master password au début de la session de travail ou la première fois que l'on en utilise une. Ensuite, on se considère en environnement sécurisé et ssh ne nous embête plus avec les authentifications même si, sous la table, les serveurs respectifs continuent à s'échanger les clés à chaque nouvelle connexion.
C'est bien beau mais l'ennui avec cela est que :
- En fait, à aucun moment cela ne concerne Git ;
- Avec un master password, TOUS les serveurs se retrouvent déverrouillés en même temps, y compris ceux qui ne sont pas des dépôts Git.
Si cela semble être la solution recherchée, c'est parce que comme ssh ne demande plus de mot de passe à Git, Git ne nous le demande plus non plus.
En fait, Git a bien un dispositif prévu pour ce cas-là : le Git Credential Storage. Mais alors pourquoi cette approche est-elle si souvent suggérée pour Git ? Parce qu'il semblerait que le module concerné ne fonctionne pas (ou mal) sous Windows (ou parfois pas installé par défaut) et que cela concerne donc beaucoup de monde, et parce que dans certains cas, l'intermittence de la demande de mot de passe peut être mal gérée par les environnements de développement qui ne sont pas prévus pour. (Bon en réalité, quand je dis « souvent », je ne suis en fait tombé récemment que sur un post en anglais traitant du même sujet. Il est possible que nous ayons lu le même).
Sous Linux, par contre, ça ne pose aucun problème. Soit tu ajoutes ceci à ton ~/.gitconfig général dans ton home :
1 2
| [credential]
helper = cache --timeout=1200 |
Soit tu écris en ligne de commande :
$ config --global --replace-all credential.helper "cache --timeout=1200"
… ce qui revient au même.
La « mise en cache » consiste à adopter grosso-modo le même comportement que sudo : il va se souvenir de ton mot de passe pendant un certain temps depuis la dernière commande tapée qui le nécessite, ici 1200 secondes (20 minutes). Tu peux changer cette valeur à loisir. L'avantage est que tu peux préciser cette option soit au niveau global, comme on vient de le faire, auquel cas ce sera le comportement adopté à défaut
d'autre chose (ce qui ne t'empêche pas de mettre en place une clé SSH vers un serveur en particulier) ou au niveau local, dans un dépôt : dans ce cas, tu ne bénéficieras de ce service que dans ledit dépôt et Git continuera à te demander ton mot de passe pour chaque transaction serveur dans tous les autres.
Partager