मैं Google की सार्वजनिक कुंजी का उपयोग करके JWT के हस्ताक्षर को मैन्युअल रूप से कैसे सत्यापित करूं?

Jan 21 2021

मैं Google स्क्रिप्ट को एक गो स्क्रिप्ट में लागू कर रहा हूं और मैं आईडी को सत्यापित करने की कोशिश कर रहा हूं कि Google द्वारा आईडी टोकन पर हस्ताक्षर किए गए हैं।

विशेष रूप से मैं यहां पहला बुलेट पॉइंट करने की कोशिश कर रहा हूं ।

मैंने टोकन प्राप्त किया है और इसे अपने हेडर, पेलोड और हस्ताक्षर में विभाजित किया है। लेकिन मुझे नहीं पता कि हस्ताक्षर को सत्यापित करने के लिए Google की सार्वजनिक कुंजी का उपयोग कैसे करें।

मैंने देखा कि हस्ताक्षर बनाने में एक HMACSHA256 एल्गोरिथ्म शामिल है , लेकिन मुझे नहीं पता कि Google क्या प्रदान करता है JWK या PEM कुंजियों के साथ क्या करना है। मैं वर्तमान में कुछ प्रतिबंधों के कारण इसे मैन्युअल रूप से कर रहा हूं।

क्या किसी को पता है कि मैं कृपया हस्ताक्षर कैसे सत्यापित कर सकता हूं?

जवाब

2 yebowhatsay Jan 21 2021 at 17:20

Php उदाहरण को देखते हुए https://github.com/googleapis/google-api-php-client/blob/2fb6e702aca5d68203fa737f89f6f774022494c6/src/AccessToken/Verify.php#L90, ऐसा लगता है कि Google API RS256 (SHA-256 के साथ RSA हस्ताक्षर) का उपयोग कर टोकन पर हस्ताक्षर करता है।

निम्नलिखित कोड को हस्ताक्षर को सत्यापित करना चाहिए और टोकन को पार्स करना चाहिए। अपने कोड में टोकन को विभाजित करने की आवश्यकता नहीं है। "github.com/pascaldekloe/jwt" पैकेज में jwt.RSACheck (टोकन [] बाइट, कुंजी * rsa.PublicKey) (* jwt.Claims, त्रुटि) आपके लिए सभी भारी उठाने का काम करेगा।

keyLocation स्थानीय रूप से संग्रहीत Google सार्वजनिक कुंजी है

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
}