我有 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
結構中定義的 username
和 password
)。然後,當我們解析令牌時,我們將能夠檢索它們的值。
如果這對您有幫助,請告訴我!
以上是如何在 Golang 中驗證 JWE 令牌的詳細內容。更多資訊請關注PHP中文網其他相關文章!