Google'ın genel anahtarını kullanarak bir JWT'nin imzasını manuel olarak nasıl doğrulayabilirim?

Jan 21 2021

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

2 yebowhatsay Jan 21 2021 at 17:20

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
}