Saya ada 2 soalan, tetapi pertama-tama saya ingin memberikan beberapa maklumat latar belakang:
Pada aplikasi web kami, kami menggunakan nextauth untuk menjana token jwt dan kemudian menambahkannya pada permintaan ke pelayan golang (digunakan untuk mendapatkan sumber).
Token yang dijana nampaknya ialah token jwe yang dijana melalui a256gcm. Dalam pelayan golang kami, kami ingin mengesahkan token dan mengeluarkan beberapa tuntutan tersuai untuknya. Walaupun begitu, kami cuba mencari cara untuk menyahsulitnya. Kami menggunakan go-jose
seperti berikut:
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)
Kami mendapat:
panic:square/go-jose:加密原语中的错误
ps: Rahsia yang saya sampaikan kepada nextauth untuk generasi jwe: thisisaverylongtextusedforhashing
Keluaran token jwe yang asal oleh nextauth, yang saya ingin sahkan dalam pelayan golang saya: eyjhbgcioijkaxiilcjlbmmioijbmju2r0nnin0..aiiqd7-cu8hu92f8.kx2k99cylyjr1p0xk_1wuskyj2cb2b xqhdmc8q4uxglhjl4je3ntp_c6nojga-fahyxyqkrzgjfllu9mc4jvuwyonx6dofq0gl3ux9abtp2t35qly-w1qkh8bdg9x4ib1ym-yvs1w-hpbbmfqr7wihys 2go6yb7sh5wwd7iqzdu-uo6eg._pqujcuymuqokid80vjidw</ kod> . <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
customclaims
结构中定义的 username
和 password
Berdasarkan komen anda, saya menyusun jawapan yang boleh membantu anda menyelesaikan masalah tersebut. Mula-mula, saya menggunakan versi 2 pakej ngopkg.in/go-jose/go-jose.v2
kerana (daripada apa yang saya dapat lihat) algoritma a256gcm
bukanlah sama seperti Versi terkini pakej, yang sepatutnya versi 3, tidak serasi sepenuhnya. Anda boleh mencari kod yang berkaitan:
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)) }
Atas ialah kandungan terperinci Bagaimana untuk mengesahkan token JWE di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!