Ich habe 2 Fragen, möchte aber zunächst einige Hintergrundinformationen liefern:
In unserer Webanwendung verwenden wir nextauth, um ein JWT-Token zu generieren und es dann an die Anfrage an den Golang-Server anzuhängen (der zum Abrufen der Ressource verwendet wird).
Der generierte Token scheint der über a256gcm generierte JWE-Token zu sein. Auf unserem Golang-Server möchten wir das Token validieren und einige benutzerdefinierte Ansprüche dafür extrahieren. Allerdings versuchen wir, einen Weg zu finden, es zu entschlüsseln. Wir verwenden go-jose
wie folgt:
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)
Wir bekommen:
panic:square/go-jose:加密原语中的错误
ps: Das Geheimnis, das ich für jwe generation an nextauth weitergegeben habe: thisisaverylongtextusedforhashing
Die ursprüngliche JWE-Token-Ausgabe von nextauth, die ich auf meinem Golang-Server überprüfen möchte: eyjhbgcioijkaxiilcjlbmmioijbmju2r0nnin0..aiiqd7-cu8hu92f8.kx2k99cylyjr1p0xk_1wusvo521t7kyskx-oeutvjcpzbx27hzh0kh2m lbl 2 go6yb7sh5wwd7iqzdu-uo6eg._pqujcuymuqokid80vjidw</ Code> . <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
customclaims
结构中定义的 username
和 password
Basierend auf Ihren Kommentaren habe ich eine Antwort zusammengestellt, die Ihnen bei der Lösung des Problems helfen kann. Zuerst habe ich Version 2 des Pakets ngopkg.in/go-jose/go-jose.v2
verwendet, weil (soweit ich sehen konnte) der Algorithmus a256gcm
nicht der ist Dasselbe wie Die neueste Version des Pakets, die Version 3 sein soll, ist nicht vollständig kompatibel. Den entsprechenden Code finden Sie unter:
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)) }
Das obige ist der detaillierte Inhalt vonSo überprüfen Sie das JWE-Token in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!