1 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊
根據(jù)您的意見(jiàn),我匯總了一個(gè)可以幫助您解決問(wèn)題的回復(fù)。首先,我使用了包的版本 2,gopkg.in/go-jose/go-jose.v2因?yàn)椋〒?jù)我所知)該算法A256GCM在最新版本的包中不完全兼容,應(yīng)該是版本 3。您可以在下面找到相關(guān)代碼:
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))
}
在這里,我們首先生成一個(gè)私鑰來(lái)加密令牌,然后通過(guò)它的公鑰對(duì)其進(jìn)行解密。為簡(jiǎn)潔起見(jiàn),我省略了用于生成和驗(yàn)證 JWT 令牌的代碼。為了測(cè)試解決方案,我向生成的令牌添加了兩個(gè)自定義聲明(username并且在結(jié)構(gòu)password中定義CustomClaims)。然后,當(dāng)我們解析令牌時(shí),我們將能夠檢索它們的值。
讓我知道這是否對(duì)您有幫助!
- 1 回答
- 0 關(guān)注
- 162 瀏覽
添加回答
舉報(bào)