php小编香蕉在本文中将介绍JWT(JSON Web Token)中的一个重要概念:令牌签名。JWT是一种用于在网络应用之间传递信息的安全标准。在JWT中,令牌签名是一种保护令牌完整性和真实性的机制。一旦令牌被签名,任何对令牌的篡改或伪造都将被立即检测到。然而,有时候我们可能需要在某些情况下不保留JWT声明的签名,本文将详细解释如何实现这一需求。
问题内容
我有以下代码。我正在使用自定义声明创建一个 json web 令牌(使用 golang-jwt)。问题是,当我使用密钥(方法 = hs256)签署令牌然后解析令牌时,声明会发生更改。我犯了什么错误。
代码:
package main
import (
"fmt"
"time"
"github.com/golang-jwt/jwt/v4"
)
type mycustomclaims struct {
userid int
jwt.registeredclaims
}
func (app *config) generatejwt(userid int) {
//code to generate jwt
jt := jwt.newwithclaims(jwt.signingmethodhs256, mycustomclaims{
userid,
jwt.registeredclaims{
expiresat: jwt.newnumericdate(time.now().add(3 * time.hour)),
issuedat: jwt.newnumericdate(time.now()),
},
})
fmt.println("what was put", jt.claims.(mycustomclaims).userid)
token, _ := jt.signedstring(app.secret)
//code to check whether claims are retained
parsed_token, _ := jwt.parsewithclaims(token, &mycustomclaims{}, func(t *jwt.token) (interface{}, error) {
return app.secret, nil
})
fmt.println("what was parsed", parsed_token.claims.(*mycustomclaims).userid)
}
输出
What was put 8
What was parsed 0
解决方法
您必须导出用户 id 字段(使其以大写字母开头)。未导出的字段无法进行 json 编码。
type MyCustomClaims struct {
UserID int `json:"userid"`
jwt.RegisteredClaims
}
以上就是令牌签名后 JWT 声明不保留的详细内容,更多请关注编程网其它相关文章!