Maison  >  Article  >  développement back-end  >  Comment vérifier le jeton JWE dans Golang

Comment vérifier le jeton JWE dans Golang

WBOY
WBOYavant
2024-02-06 09:30:15571parcourir

如何在 Golang 中验证 JWE 令牌

Contenu des questions

J'ai 2 questions, mais je souhaite d'abord fournir quelques informations générales :

Sur notre application Web, nous utilisons nextauth pour générer un jeton jwt, puis l'ajoutons à la requête adressée au serveur golang (utilisé pour obtenir la ressource).

Le jeton généré semble être le jeton jwe généré via a256gcm. Dans notre serveur Golang, nous souhaitons valider le jeton et en extraire des revendications personnalisées. Cela dit, nous essayons de trouver un moyen de le décrypter. Nous utilisons go-jose comme suit :

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)

Nous obtenons : panic:square/go-jose:加密原语中的错误

ps : Le secret que j'ai transmis à nextauth pour la génération jwe : thisisaverylongtextusedforhashing

Le jeton jwe original généré par nextauth, que je souhaite vérifier sur mon serveur golang : eyjhbgcioijkaxiilcjlbmmioijbmju2r0nnin0..aiiqd7-cu8hu92f8.kx2k99cylyjr1p0xk_1wusvo521t7kyskx-oeutvjcpzbx27hzh0kh2m lbl xqhdmc 8q4uxglhjl4je3ntp_c6nojga-fahyxyqkrzgjfllu9mc4jvuwyonx6dofq0gl3ux9abtp2t35qly-w1qkh8bdg9x4ib1ym-yvs1w-hpbbmfqr7u7x4ohwih_yjqlwadesyq 6da7a97gssxs 2go6yb7 sh5wwd7iqzdu-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

Bonne réponse

customclaims 结构中定义的 usernamepasswordSur la base de vos commentaires, j'ai compilé une réponse qui peut vous aider à résoudre le problème. Tout d'abord, j'ai utilisé la version 2 du package ngopkg.in/go-jose/go-jose.v2 car (d'après ce que j'ai pu voir) l'algorithme a256gcm n'est pas le idem La dernière version du package, qui est censée être la version 3, n'est pas entièrement compatible. Vous pouvez retrouver le code correspondant :

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))
}

Ici, nous générons d'abord une clé privée pour chiffrer le token puis le décryptons via sa clé publique. Par souci de brièveté, j'ai omis le code de génération et de validation du jeton jwt. Pour tester cette solution, j'ai ajouté deux revendications personnalisées (en 🎜) au jeton généré. Ensuite, lorsque nous analyserons les jetons, nous pourrons récupérer leurs valeurs. 🎜 Si cela vous aide, faites-le moi savoir ! 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer