【发布时间】:2020-09-13 08:17:44
【问题描述】:
我正在阅读 JWT 的示例文件夹,我有点不确定验证令牌的工作原理。
func ExampleNewWithClaims_customClaimsType() {
mySigningKey := []byte("AllYourBase")
type MyCustomClaims struct {
Foo string `json:"foo"`
jwt.StandardClaims
}
// Create the Claims
claims := MyCustomClaims{
"bar",
jwt.StandardClaims{
ExpiresAt: 15000,
Issuer: "test",
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
ss, err := token.SignedString(mySigningKey)
fmt.Printf("%v %v", ss, err)
//Output: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.HE7fK0xOQwFEr4WDgRWj4teRPZ6i3GLwD5YCm6Pwu_c <nil>
}
Here 直截了当,令牌正在这里签名 token.SignedString(mySigningKey) 使用“mySigningKey”
现在unparsing 对我来说不太清楚:
func ExampleParseWithClaims_customClaimsType() {
tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.HE7fK0xOQwFEr4WDgRWj4teRPZ6i3GLwD5YCm6Pwu_c"
type MyCustomClaims struct {
Foo string `json:"foo"`
jwt.StandardClaims
}
// sample token is expired. override time so it parses as valid
at(time.Unix(0, 0), func() {
token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
return []byte("AllYourBase"), nil
})
if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
fmt.Printf("%v %v", claims.Foo, claims.StandardClaims.ExpiresAt)
} else {
fmt.Println(err)
}
})
// Output: bar 15000
}
是否需要验证客户端返回的令牌字符串的签名是否有效?
- 解码声明(在 &MyCustomClaims{} 中完成)
- 使用 token.Valid 验证已解码声明的签名部分是否对“令牌中包含的公钥”有效。
但这个例子只是解码密钥,通过“magic”返回的是密钥/签名密钥?
这对我来说根本没有意义。同样返回对公钥的有效声明是没有用的,因为它可以由任何私钥完成。
我错过了什么?
【问题讨论】:
-
作为最后一个参数传递给 ParseWithClaims 的函数返回密钥。密钥不是令牌的一部分(你是对的,这会使令牌完全没有意义)。