Le chiavi VAPID (Voluntary Application Server Identification for Web Push) sono utilizzate nel contesto delle notifiche push per autenticare il server di origine e consentire l'invio di messaggi push ai client. In questo articolo, vedremo come generare le chiavi VAPID utilizzando il linguaggio di programmazione Go.
Prerequisiti
- Installazione di Go: Assicurati di avere Go installato sul tuo sistema. Puoi scaricarlo da golang.org.
- Modulo
github.com/cespare/xxhash
: Utilizzeremo questo modulo per l'hashing. - Familiarità con i concetti di base delle notifiche push e la libreria
crypto/elliptic
.
Crea una nuova directory per il tuo progetto e inizializza un nuovo modulo Go:
mkdir vapid-keygen
cd vapid-keygen
go mod init vapid-keygen
Anche se per questo esempio non utilizzeremo molte dipendenze esterne, è buona norma installare quelle necessarie:
go get -u github.com/cespare/xxhash
Crea un file main.go
e aggiungi il seguente codice:
package main
import (
"crypto/elliptic"
"crypto/ecdsa"
"crypto/rand"
"encoding/base64"
"fmt"
"log"
)
func generateVAPIDKeys() (string, string, error) {
// Curva ellittica P-256
curve := elliptic.P256()
privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)
if err != nil {
return "", "", err
}
// Estrazione della chiave pubblica
publicKey := append(privateKey.PublicKey.X.Bytes(), privateKey.PublicKey.Y.Bytes()...)
// Codifica in Base64 delle chiavi
publicKeyBase64 := base64.RawURLEncoding.EncodeToString(publicKey)
privateKeyBase64 := base64.RawURLEncoding.EncodeToString(privateKey.D.Bytes())
return publicKeyBase64, privateKeyBase64, nil
}
func main() {
pubKey, privKey, err := generateVAPIDKeys()
if err != nil {
log.Fatalf("Error generating VAPID keys: %v", err)
}
fmt.Printf("Public Key: %s\n", pubKey)
fmt.Printf("Private Key: %s\n", privKey)
}
Questo codice genera una coppia di chiavi usando la curva ellittica P-256 e le codifica in formato base64 URL-safe.
Una volta generate le chiavi, possono essere utilizzate per autenticare le notifiche push. Di seguito è riportato un esempio di come utilizzare queste chiavi con la libreria web-push
per inviare notifiche push:
package main
import (
"github.com/SherClockHolmes/webpush-go"
"log"
)
func main() {
sub := &webpush.Subscription{
Endpoint: "https://fcm.googleapis.com/fcm/send/...",
Keys: webpush.Keys{
Auth: "your_auth_key",
P256dh: "your_p256dh_key",
},
}
resp, err := webpush.SendNotification([]byte("Test message"), sub, &webpush.Options{
VAPIDPublicKey: "your_public_key",
VAPIDPrivateKey: "your_private_key",
VAPIDSubject: "mailto:example@yourdomain.org",
})
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
}
Conclusione
In questo articolo abbiamo visto come generare le chiavi VAPID utilizzando Go. Queste chiavi sono essenziali per autenticare le notifiche push e garantire la sicurezza della comunicazione tra il server e il client. Con le chiavi generate, puoi ora procedere a implementare la tua soluzione di notifiche push.