Google'ın genel anahtarını kullanarak bir JWT'nin imzasını manuel olarak nasıl doğrulayabilirim?
Bir Go komut dosyasında Google girişi yapıyorum ve Kimlik Simgesinin Google tarafından imzalandığını doğrulamaya çalışırken takılı kaldım.
Özellikle burada ilk madde işaretini yapmaya çalışıyorum .
Jetonu aldım ve başlığına, yüküne ve imzasına böldüm. Ancak imzayı doğrulamak için Google'ın genel anahtarını nasıl kullanacağımı bilmiyorum.
İmza oluşturmanın bir HMACSHA256 algoritması içerdiğini gördüm , ancak Google'ın sağladığı JWK veya PEM anahtarlarıyla ne yapacağımı tam olarak bilmiyorum. Şu anda belirli kısıtlamalar nedeniyle manuel olarak yapıyorum.
İmzayı nasıl doğrulayabileceğimi bilen var mı lütfen?
Yanıtlar
Php örneğine bakıyorum https://github.com/googleapis/google-api-php-client/blob/2fb6e702aca5d68203fa737f89f6f774022494c6/src/AccessToken/Verify.php#L90, Google API'nin jetonları RS256 (SHA-256 ile RSA İmzası) kullanarak imzaladığı anlaşılıyor.
Aşağıdaki kod imzayı doğrulamalı ve belirteci ayrıştırmalıdır. Kodunuzdaki belirteci bölmenize gerek yoktur. "github.com/pascaldekloe/jwt" paketindeki jwt.RSACheck (token [] byte, key * rsa.PublicKey) (* jwt.Claims, error) sizin için tüm ağır işleri halledecektir.
keyLocation, yerel olarak depolanan Google genel anahtarıdır
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
}