首頁 > 後端開發 > Golang > 如何在 Golang 中驗證 JWE 令牌

如何在 Golang 中驗證 JWE 令牌

WBOY
發布: 2024-02-06 09:30:15
轉載
613 人瀏覽過

如何在 Golang 中验证 JWE 令牌

問題內容

我有 2 個問題,但首先我想提供一些背景資訊:

在我們的 web 應用程式上,我們使用 nextauth 產生 jwt 令牌,然後將其附加到針對 golang 伺服器的請求(用於取得資源)。

產生的令牌似乎是透過 a256gcm 產生的 jwe 令牌。在我們的 golang 伺服器中,我們想要驗證令牌並提取它的一些自訂聲明。也就是說,我們正在努力尋找一種解密方法。我們使用 go-jose 如下:

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)
登入後複製

我們得到: panic:square/go-jose:加密原語中的錯誤

ps:我傳遞給用於 jwe 產生的 nextauth 的秘密:thisisaverylongtextusedforhashing

#nextauth 輸出的原始jwe 令牌,我想在我的golang 伺服器中驗證:eyjhbgcioijkaxiilcjlbmmioijbmju2r0nnin0..aiiqd7-cu8hu92f8.kx2k99cylyjr1p0xxkhx uxglhjl4je3ntp_c6nojga-fahyxyqkrzgjfllu9mc4jvuwyonx6dofq0gl3ux9abtp2t35qly-w1qkh8bdg9x4ib1ym-yvs1w-hpbbmfqr7u7x4wwh0 eg._pqujcuymuqokid80vjidw


正確答案


根據您的意見,我整理了一個可以幫助您解決問題的回應。首先,我使用了ngopkg.in/go-jose/go-jose.v2 軟體包的版本2,因為(從我所看到的)演算法a256gcm 與應該是版本3 的最新版本的軟體包不完全相容。您可以找到相關程式碼:

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))
}
登入後複製

這裡,我們首先產生一個私鑰來加密令牌,然後透過其公鑰對其進行解密。為了簡潔起見,我省略了用於產生和驗證 jwt 令牌的程式碼。為了測試該解決方案,我為生成的令牌添加了兩個自訂聲明(在 customclaims 結構中定義的 usernamepassword)。然後,當我們解析令牌時,我們將能夠檢索它們的值。
如果這對您有幫助,請告訴我!

以上是如何在 Golang 中驗證 JWE 令牌的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板