L'autenticazione a due fattori (2FA) è un metodo di sicurezza che richiede due forme di identificazione prima di concedere l'accesso a un sistema. In questo articolo vedremo come implementare un semplice sistema 2FA utilizzando codici TOTP (Time-based One-Time Password) in Go.
Prerequisiti
- Un ambiente Go configurato
- Una libreria TOTP, come
github.com/pquerna/otp
1. Installare la libreria OTP
Per cominciare, dobbiamo installare la libreria che gestisce TOTP:
go get github.com/pquerna/otp
2. Generare un secret TOTP
Ogni utente dovrebbe avere un secret univoco che verrà usato per generare i codici temporanei. Ecco come generarlo:
package main
import (
"fmt"
"github.com/pquerna/otp/totp"
)
func main() {
key, err := totp.Generate(totp.GenerateOpts{
Issuer: "EsempioApp",
AccountName: "utente@example.com",
})
if err != nil {
panic(err)
}
fmt.Println("Secret:", key.Secret())
fmt.Println("URL OTPAuth:", key.URL())
}
Il campo key.URL() può essere trasformato in un QR code e scansionato con un'app come Google Authenticator o Authy.
3. Verificare i codici OTP
Una volta che l'utente ha configurato l'app 2FA, può iniziare a inserire i codici generati. Possiamo verificarli con:
package main
import (
"fmt"
"github.com/pquerna/otp/totp"
"time"
)
func main() {
secret := "ABCDEF1234567890" // sostituire con il secret dell'utente
code := "123456" // codice inserito dall'utente
valid := totp.Validate(code, secret)
if valid {
fmt.Println("Codice valido")
} else {
fmt.Println("Codice non valido")
}
}
La funzione totp.Validate si occupa di confrontare il codice inserito con quello generato sul momento, accettando una piccola finestra temporale per compensare eventuali differenze di orario.
4. Sicurezza e buone pratiche
- Conservare i secret TOTP in modo sicuro, ad esempio in un database cifrato.
- Utilizzare HTTPS per tutte le comunicazioni tra client e server.
- Non loggare mai i secret o i codici OTP.
Conclusione
Implementare l'autenticazione a due fattori in Go è relativamente semplice grazie a librerie come pquerna/otp. Aggiungendo questa misura di sicurezza si protegge meglio l'accesso degli utenti, riducendo il rischio di compromissioni anche in caso di furto di password.