Introduzione
Autenticarsi a un remote Git è perlopiù invisibile finché qualcosa non va storto. I due meccanismi principali sono chiavi SSH e credenziali HTTPS (password o, più comunemente oggi, personal access token).
Chiavi SSH
Genera una chiave moderna:
ssh-keygen -t ed25519 -C "[email protected]"
ssh-add --apple-use-keychain ~/.ssh/id_ed25519 # macOS
ssh-add ~/.ssh/id_ed25519 # Linux
Aggiungi la chiave pubblica (~/.ssh/id_ed25519.pub) al tuo account di hosting. Test:
ssh -T [email protected]
# Hi ada! You've successfully authenticated...
Configurazione SSH
Le sovrascritture per host vanno in ~/.ssh/config:
Host github.com
User git
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Credenziali HTTPS
La maggior parte degli host non accetta più le password dell'account; usa un personal access token (PAT) con gli scope giusti. Git lo memorizza tramite un credential helper:
git config --global credential.helper cache # in memoria, scade
git config --global credential.helper "cache --timeout=86400"
git config --global credential.helper osxkeychain # macOS
git config --global credential.helper manager # Windows
git config --global credential.helper store # file in chiaro (solo se devi)
La prima volta che fai push, Git richiede il token e l'helper lo salva.
Ispezionare e cancellare
echo "url=https://github.com" | git credential fill
echo "url=https://github.com" | git credential reject
git credential è un'interfaccia di basso livello all'helper.
Helper per host
git config --global credential.https://github.com.helper manager
git config --global credential.https://gitlab.com.helper cache
Utile quando host diversi richiedono metodi di auth diversi.
Firmare commit e tag
Autenticazione e firma sono diverse. La firma prova la paternità di un commit:
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git commit -S -m "Signed commit"
git log --show-signature -1
2FA e SSO
Se il tuo host richiede 2FA, l'auth HTTPS ha bisogno di un PAT (le password sono bloccate). Per le organizzazioni protette da SSO, il PAT deve essere anche autorizzato SSO; altrimenti i push ricevono un errore vago "permission denied".
Credenziali per URL
Il sistema di credenziali di Git può memorizzare credenziali diverse per host o path. La chiave di match è il prefisso URL, quindi puoi avere token separati per, diciamo, le tue org GitHub personali e di lavoro:
git config --global credential.https://github.com/work-org.helper manager
git config --global credential.https://github.com/personal.helper "store --file ~/.git-creds-personal"
git credential fill <<<"url=https://github.com/work-org/repo"
L'impostazione credential.useHttpPath dice a Git di includere il path nella chiave di lookup, permettendo credenziali per repo. Usalo solo quando necessario; moltiplica il numero di entry memorizzate.
Errori comuni
Pushare con un token che manca degli scope giusti (es. read-only); il messaggio di errore è generico. Concedere scope eccessivamente ampi "per sicurezza"; minimizza. Memorizzare token in credential.helper store su macchine condivise; è un file in chiaro. Dimenticare di caricare la tua chiave pubblica SSH sull'host ed essere sconcertati da "permission denied (publickey)"; ssh -vT git@host mostra cosa sta succedendo. Infine, mescolare protocolli: assicurati che il tuo URL remote corrisponda al tuo metodo di auth; git remote set-url può cambiarlo.