Bagaimana untuk mengesahkan token JWE di Golang

WBOY
Lepaskan: 2024-02-06 09:30:15
ke hadapan
570 orang telah melayarinya

如何在 Golang 中验证 JWE 令牌

Kandungan soalan

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)
Salin selepas log masuk

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

Jawapan betul

customclaims 结构中定义的 usernamepasswordBerdasarkan 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))
}
Salin selepas log masuk
Di sini, kami mula-mula menjana kunci peribadi untuk menyulitkan token dan kemudian menyahsulitnya melalui kunci awamnya. Demi ringkasnya, saya telah meninggalkan kod untuk menjana dan mengesahkan token jwt. Untuk menguji penyelesaian ini, saya menambahkan dua tuntutan tersuai (dalam 🎜) pada token yang dijana. Kemudian apabila kita menghuraikan token kita akan dapat mendapatkan semula nilainya. 🎜 Jika ini membantu anda, sila beritahu saya! 🎜

Atas ialah kandungan terperinci Bagaimana untuk mengesahkan token JWE di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!