Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengesahkan token JWE di Golang

Bagaimana untuk mengesahkan token JWE di Golang

WBOY
WBOYke hadapan
2024-02-06 09:30:15571semak imbas

如何在 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)

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

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam