Heim  >  Artikel  >  Backend-Entwicklung  >  So überprüfen Sie das JWE-Token in Golang

So überprüfen Sie das JWE-Token in Golang

WBOY
WBOYnach vorne
2024-02-06 09:30:15570Durchsuche

如何在 Golang 中验证 JWE 令牌

Frageninhalt

Ich habe 2 Fragen, möchte aber zunächst einige Hintergrundinformationen liefern:

In unserer Webanwendung verwenden wir nextauth, um ein JWT-Token zu generieren und es dann an die Anfrage an den Golang-Server anzuhängen (der zum Abrufen der Ressource verwendet wird).

Der generierte Token scheint der über a256gcm generierte JWE-Token zu sein. Auf unserem Golang-Server möchten wir das Token validieren und einige benutzerdefinierte Ansprüche dafür extrahieren. Allerdings versuchen wir, einen Weg zu finden, es zu entschlüsseln. Wir verwenden go-jose wie folgt:

rawToken := `eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..aiIqD7-cU8Hu92F8.Kx2k99cyLYJR1P0xK_1wUsVO521T7kYSKx-OEutVJcpzbX27hZH0kh2MlBLxQHdmc8q4uXglhjl4JE3nTp_c6nOjga-faHyxYqKrZGJFLlu9MC4JVUWyonX6doFq0gl3UX9ABtP2t35Qly-w1qKH8BdG9x4iB1YM-yvs1w-HpBbMFQR7U7X4oHWIh_YJQlWADesYq6da7A97GSSXs2Go6yb7SH5WWd7iQzDu-UO6eg._PqujCUyMUqOkID80vJiDw`
key := []byte("thisisaverylongtextusedforhashing")

enc, err := jwt.ParseEncrypted(rawToken)
if err != nil {
    panic(err)
}

out := jwt.Claims{}
if err := enc.Claims(key, &out); err != nil {
    panic(err)
}
fmt.Printf("iss: %s, sub: %s\n", out.Issuer, out.Subject)

Wir bekommen: panic:square/go-jose:加密原语中的错误

ps: Das Geheimnis, das ich für jwe generation an nextauth weitergegeben habe: thisisaverylongtextusedforhashing

Die ursprüngliche JWE-Token-Ausgabe von nextauth, die ich auf meinem Golang-Server überprüfen möchte: eyjhbgcioijkaxiilcjlbmmioijbmju2r0nnin0..aiiqd7-cu8hu92f8.kx2k99cylyjr1p0xk_1wusvo521t7kyskx-oeutvjcpzbx27hzh0kh2m lbl 2 go6yb7sh5wwd7iqzdu-uo6eg._pqujcuymuqokid80vjidw Code> . <code>eyjhbgcioijkaxiilcjlbmmioijbmju2r0nnin0..aiiqd7-cu8hu92f8.kx2k99cylyjr1p0xk_1wusvo521t7kyskx-oeutvjcpzbx27hzh0kh2m lblxqhdmc8q4uxglhjl4je3ntp_c6nojga-fahyxyqkrzgjfllu9mc4jvuwyonx6dofq0gl3ux9abtp2t35qly-w1qkh8bdg9x4ib1ym-yvs1w-hpbbmfqr7u7x4ohwih_yjqlwadesyq 6da7a97gssxs2go6yb7sh5wwd7iqzdu-uo6eg._pqujcuymuqokid80vjidw


正确答案


根据您的意见,我整理了一个可以帮助您解决问题的回复。首先,我使用了 ngopkg.in/go-jose/go-jose.v2 软件包的版本 2,因为(从我所看到的)算法 a256gcm

Richtige Antwort

customclaims 结构中定义的 usernamepasswordBasierend auf Ihren Kommentaren habe ich eine Antwort zusammengestellt, die Ihnen bei der Lösung des Problems helfen kann. Zuerst habe ich Version 2 des Pakets ngopkg.in/go-jose/go-jose.v2 verwendet, weil (soweit ich sehen konnte) der Algorithmus a256gcm nicht der ist Dasselbe wie Die neueste Version des Pakets, die Version 3 sein soll, ist nicht vollständig kompatibel. Den entsprechenden Code finden Sie unter:

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "fmt"
    "io"
    "os"
    "time"

    "github.com/golang-jwt/jwt"
    jose_jwt "gopkg.in/go-jose/go-jose.v2"
)

type CustomClaims struct {
    Username string `json:"username"`
    Password string `json:"password"`
    jwt.StandardClaims
}

func main() {
    privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        panic(err)
    }

    // generate token
    token, err := generateToken()
    if err != nil {
        panic(err)
    }

    publicKey := &privateKey.PublicKey
    encrypter, err := jose_jwt.NewEncrypter(jose_jwt.A256GCM, jose_jwt.Recipient{
        Algorithm: jose_jwt.RSA_OAEP_256,
        Key:       publicKey,
    }, nil)
    if err != nil {
        panic(err)
    }

    plainText := []byte(token)
    object, err := encrypter.Encrypt(plainText)
    if err != nil {
        panic(err)
    }

    serialized := object.FullSerialize()

    object, err = jose_jwt.ParseEncrypted(serialized)
    if err != nil {
        panic(err)
    }

    decrypted, err := object.Decrypt(privateKey)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(decrypted))

    // parse token
    claims, err := ValidateToken(string(decrypted))
    if err != nil {
        panic(err)
    }

    fmt.Println(len(claims))
}

Hier generieren wir zunächst einen privaten Schlüssel, um den Token zu verschlüsseln, und entschlüsseln ihn dann über seinen öffentlichen Schlüssel. Der Kürze halber habe ich den Code zum Generieren und Validieren des JWT-Tokens weggelassen. Um diese Lösung zu testen, habe ich dem generierten Token zwei benutzerdefinierte Ansprüche (in 🎜) hinzugefügt. Wenn wir dann die Token analysieren, können wir ihre Werte abrufen. 🎜 Wenn Ihnen das hilft, lassen Sie es mich bitte wissen! 🎜

Das obige ist der detaillierte Inhalt vonSo überprüfen Sie das JWE-Token in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen