猿问

如何在 Golang 中验证 JWE 令牌

我有 2 个问题,但首先我想提供一些背景信息:


在我们的网络应用程序上,我们使用 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: error in cryptographic primitive


PS:我传递给用于 JWE 生成的 nextAuth 的秘密:thisisaverylongtextusedforhashing


NextAuth 输出的原始 JWE 令牌,我想在我的 golang 服务器中验证它:eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..aiIqD7-cU8Hu92F8.Kx2k99cyLYJR1P0xK_1wUsVO521T7kYSKx-OEutVJcpzbX27hZH0kh2MlBLxQHdmc8q4uXglhjl4JE3nTp_c6nOjga-faHyxYqKrZGJFLlu9MC4JVUWyonX6doFq0gl3UX9ABtP2t35Qly-w1qKH8BdG9x4iB1YM-yvs1w-HpBbMFQR7U7X4oHWIh_YJQlWADesYq6da7A97GSSXs2Go6yb7SH5WWd7iQzDu-UO6eg._PqujCUyMUqOkID80vJiDw。


慕姐4208626
浏览 181回答 1
1回答

噜噜哒

根据您的意见,我汇总了一个可以帮助您解决问题的回复。首先,我使用了包的版本 2,gopkg.in/go-jose/go-jose.v2因为(据我所知)该算法A256GCM在最新版本的包中不完全兼容,应该是版本 3。您可以在下面找到相关代码:package mainimport (    "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 令牌的代码。为了测试解决方案,我向生成的令牌添加了两个自定义声明(username并且在结构password中定义CustomClaims)。然后,当我们解析令牌时,我们将能够检索它们的值。让我知道这是否对您有帮助!
随时随地看视频慕课网APP

相关分类

Go
我要回答