如何在 Golang 中验证 JWT 令牌
How to validate a JWT token in Golang
我想检查 JWT 是否从我们的服务器生成?
我使用 JWT 进行身份验证并将 RS256 用作 JWT 的算法
现在,我想在 Golang 中编写一个函数来验证 JWT 令牌是否属于我们。
下面是我已经实现的代码:
publicKey = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAxxxxxxf2iF+20xHTZ4jTUBzYmikBuUsm0839T5SDmwEquTB\nfQIDAQAB\n-----END PUBLIC KEY-----\n"
// sample token string taken from the New example
tokenString := this.JWT[0]
claims := jwt.MapClaims{}
token, err := jwt.ParseWithClaims(tokenString, &claims, func(token *jwt.Token) (interface{}, error) {
return []byte(publicKey), nil
})
// ... error handling
if err != nil {
fmt.Println(err)
}
fmt.Println("TOKEN is:", token.Valid)
// do something with decoded claims
for key, val := range claims {
fmt.Printf("Key: %v, value: %v\n", key, val)
}
这是输出:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvs97nrY4XqXVJT1Y4AU5
xxx
TLWXK2H4swuXSEyV75Ylem+f2iF+20xHTZ4jTUBzYmikBuUsm0839T5SDmwEquTB
fQIDAQAB
-----END PUBLIC KEY-----
key is of invalid type
TOKEN is: false
Key: iss, value: https://example.com
Key: nbf, value: 1.592797834e+09
Key: exp, value: 1.592801434e+09
Key: sub, value: 3
Key: aid, value: 2
Key: fea, value: 0
Key: iat, value: 1.592797834e+09
Key: aud, value: []
Key: jti, value: 7a97a2327e671d2bf01253819fb319d6
我观察到 key is of invalid type
和 token.valid
是 false
。
谁能帮我指出错误的代码以及如何解决这个问题?
提前谢谢!!!
将 []byte(publicKey)
传递给 keyFunc
是 错误的。
在 rsa
的情况下(即 RS256
、RS512
或 RS384
),您应该 return 改为 *rsa.PublicKey
(参见this 了解有关如何实施 Verfiy()
的更多信息。
使用 ExampleParsePKIXPublicKey()
here to parse and decode your string public key or as mentioned by @Dan, you can use ParseRSAPublicKeyFromPEM
(see this 获取更多信息。
从 public 键中删除换行符并尝试一下。
publicKey = "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAxxxxxxf2iF+20xHTZ4jTUBzYmikBuUsm0839T5SDmwEquTBfQIDAQAB-----END PUBLIC KEY-----"
我想检查 JWT 是否从我们的服务器生成?
我使用 JWT 进行身份验证并将 RS256 用作 JWT 的算法
现在,我想在 Golang 中编写一个函数来验证 JWT 令牌是否属于我们。 下面是我已经实现的代码:
publicKey = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAxxxxxxf2iF+20xHTZ4jTUBzYmikBuUsm0839T5SDmwEquTB\nfQIDAQAB\n-----END PUBLIC KEY-----\n"
// sample token string taken from the New example
tokenString := this.JWT[0]
claims := jwt.MapClaims{}
token, err := jwt.ParseWithClaims(tokenString, &claims, func(token *jwt.Token) (interface{}, error) {
return []byte(publicKey), nil
})
// ... error handling
if err != nil {
fmt.Println(err)
}
fmt.Println("TOKEN is:", token.Valid)
// do something with decoded claims
for key, val := range claims {
fmt.Printf("Key: %v, value: %v\n", key, val)
}
这是输出:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvs97nrY4XqXVJT1Y4AU5
xxx
TLWXK2H4swuXSEyV75Ylem+f2iF+20xHTZ4jTUBzYmikBuUsm0839T5SDmwEquTB
fQIDAQAB
-----END PUBLIC KEY-----
key is of invalid type
TOKEN is: false
Key: iss, value: https://example.com
Key: nbf, value: 1.592797834e+09
Key: exp, value: 1.592801434e+09
Key: sub, value: 3
Key: aid, value: 2
Key: fea, value: 0
Key: iat, value: 1.592797834e+09
Key: aud, value: []
Key: jti, value: 7a97a2327e671d2bf01253819fb319d6
我观察到 key is of invalid type
和 token.valid
是 false
。
谁能帮我指出错误的代码以及如何解决这个问题?
提前谢谢!!!
将 []byte(publicKey)
传递给 keyFunc
是 错误的。
在 rsa
的情况下(即 RS256
、RS512
或 RS384
),您应该 return 改为 *rsa.PublicKey
(参见this 了解有关如何实施 Verfiy()
的更多信息。
使用 ExampleParsePKIXPublicKey()
here to parse and decode your string public key or as mentioned by @Dan, you can use ParseRSAPublicKeyFromPEM
(see this 获取更多信息。
从 public 键中删除换行符并尝试一下。
publicKey = "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAxxxxxxf2iF+20xHTZ4jTUBzYmikBuUsm0839T5SDmwEquTBfQIDAQAB-----END PUBLIC KEY-----"