Wie überprüfe ich die Signatur eines JWT manuell mit dem öffentlichen Schlüssel von Google?
Ich implementiere die Google-Anmeldung in einem Go-Skript und versuche nicht zu überprüfen, ob das ID-Token von Google signiert wurde.
Insbesondere versuche ich in den ersten Aufzählungspunkt zu tun hier .
Ich habe das Token erhalten und es in Header, Nutzlast und Signatur aufgeteilt. Ich weiß jedoch nicht, wie ich den öffentlichen Schlüssel von Google verwenden soll, um die Signatur zu überprüfen.
Ich habe gesehen, dass das Generieren einer Signatur einen HMACSHA256-Algorithmus beinhaltet , aber ich weiß nicht genau, was ich mit den von Google bereitgestellten JWK- oder PEM-Schlüsseln tun soll. Ich mache es derzeit aufgrund bestimmter Einschränkungen manuell.
Weiß jemand, wie ich die Unterschrift bitte überprüfen kann?
Antworten
Schauen Sie sich das PHP-Beispiel an https://github.com/googleapis/google-api-php-client/blob/2fb6e702aca5d68203fa737f89f6f774022494c6/src/AccessToken/Verify.php#L90Es scheint, dass die Google API die Token mit RS256 signiert (RSA-Signatur mit SHA-256).
Der folgende Code sollte die Signatur überprüfen und das Token analysieren. Es ist nicht erforderlich, das Token in Ihrem Code aufzuteilen. jwt.RSACheck (Token [] Byte, Schlüssel * rsa.PublicKey) (* jwt.Claims, Fehler) im Paket "github.com/pascaldekloe/jwt" würde das ganze schwere Heben für Sie erledigen.
keyLocation ist der lokal gespeicherte öffentliche Google-Schlüssel
package main
import "github.com/pascaldekloe/jwt"
//jwtValidator verifies and parses the JWT Token
func jwtValidator(token string, keyLocation string) (j *jwtToken, err error) {
token := []byte(token)
pubK, err := rsaPublicKey(keyLocation)
if err != nil {
return
}
// parses the token only if signature is valid
claims, err := jwt.RSACheck(token, pubK)
if err != nil {
err = fmt.Errorf("token signature invalid %s", err)
return
}
if !claims.Valid(time.Now()) {
err = fmt.Errorf("token time constraints exceeded")
return
}
j = &jwtToken{
id: claims.ID,
issuer: claims.Issuer,
issued: claims.Issued,
subject: claims.Subject,
expires: claims.Expires,
}
return
}