密钥类型无效
key is of invalid type
背景:我正在尝试用Go语言重写Step 1 in this guide
我有
- 一个 JWT 令牌(
tokenString
使用 RS256 算法可以查看 here)
- 一个键(SSH RFC-4253 format 中的
key
)。
我正在尝试使用此密钥来验证 JWT 令牌。这是我的代码
import (
"fmt"
"github.com/golang-jwt/jwt/v4"
)
tokenString := "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE2MzQ3NzE5OTMsImV4cCI6MTY2NjMwNzk5MywiYXVkIjoiaHR0cHM6Ly9hcGkuYXV0aG9yaXpvbi5jb20vdjEvIiwiaXNzIjoiaHR0cHM6Ly9hdXRob3Jpem9uLmNvbS8iLCJzdWIiOiIzOGQ3ZjMxZTVjMzc0MGM5YjQwMmFlZTI4YzRhYjc3MCIsInBlZXJfdHlwZSI6ImNsaWVudCJ9.CNNNxkhN_xmpiiihrZS2fAJSaDCx9kpBXA9G8adh3BbGOs681381Jl63q9ZNgOXsf64ZLlVEtk6YirhaloZ05ZQIEGklXh98h7EPrvNWyAUwEzSHsoAUmmnuSG7EZn4xo7utNuk4UuFOwf63FwAJN6yU5X9gHwTXlf8JjGXAbFSj-QCmX-g1TfVRPwsGAJqM03thKVc-OiOuevJr04y1DnFx3kXiMeGgRMLpPzhYDgsUkCcyITIl1SIZXY_6ifwbPibqwpPy-r0bWi0hczNBJ_wxa3wElRm0Ib-XxldgpZNI3GD9RcTdzDW5jg5Upuf0ar8BKJDHjoWfGIoD93mRA4opT4gd5IMEU16w-d_UBPu0D96Q002kbq3Ou1_iKaS1APUKnCSfyfZK2o5W_OAYbD0FkkxpqTApRaoPws1a0yGpET6pYmQHUE2Jo-1ZH6uSnPf8kT1lwoyVJzs4ScOcjilApL4JXqV_SOGWA5WiFJG5qcigFlFWRYuVitjyXQTzsxIZnKaYsElf2KUOvXgeqHXGAsGsuYs-5fR7vQOdV02n_QOU0Kr_r13I3TP1OiaL2YSGxiNMqKmWM32KNYTAFYKrWoaz_TYSgrQSv1d96E0VgipxmAucM_-qw_sa1eVeUf8XLMGYl3x1Ssv8YY5eRPOWQ8FgAmAJq5MU1y11Dao"
key := "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDqSnARw5EZWAMSW3njVBfi6GAHe0N4rp51Uv2k107p5ZpF3gNPU0GTAQyhRBrwydaoHpeoI9Q2D3/8ornVUF+os6hiOltp885VPYrVSt6aN4vPj3UbuVykOhXoEln9CEbUb0dIfKCsiugHu94as38SE6DtVeRuQlGqpczIHdNkaFVRIx4hzeRmUZ2CyyA+8/kJgODeePP6hfHvoL2s45AC/VoffGEfskn6byC1okrfh3Fnb+ouJJYWgTqrQoQSx45Mz+NBwpBfeucAar02zD5chi/dXkwULBEF2hX9tqySuSqq544bK+ECygROuNTMYMAHPEhki1iroyHmxrer8sW/cEQcaqixB2Vu07ZWJgh2tMekLrjvRBbobervsXaXFDzjWPLY1OGsZqvSxuRSfCiQk645dzL/mXDj484FQGQ6pY6P9Tnc2alDs6yhtGb5vQtW5uFDRyfVpCBdvZjvpRXWEPHTEbKygKIy04QEi+QvZcInm6idBD00oIefJtsLvD+ZGyNM2L29gVP4klJoHZuXcXX1mxZFLMKvSIB9nl0+KRoMhaPaqyInPu8Amlp1+fkQBwaHfaVJFCPbGzrf580t7flQEmtLBX8k+4eCs6g5sTCLXWaVotsTFKspKz0nb7B/f6WEIjDpkZ4Xcgzx9nQwPThoywZi+PfykZjoh4RvcQ== homiao@LCNC02F10MAMD6R"
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte(key), nil
})
if err != nil {
fmt.Printf("%v", err)
}
但是,我得到了错误
key is of invalid type
任何有用的帮助或其他库都很棒!
我想你必须 return 一个 *rsa.PublicKey
而不是 jwt.KeyFunc
的 []byte。这是一个猜测,看你的关键字符串
而不是:
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte(key), nil
})
尝试:
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return jwt.ParseRSAPublicKeyFromPEM([]byte(key))
})
您还可以在签名方法上使用 switch case:
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
switch token.Method {
case jwt.SigningMethodHS256.Alg():
return []byte(key)
case jwt.SigningMethodRS512.Alg():
return jwt.ParseRSAPublicKeyFromPEM([]byte(key))
// and so on...
}
...
})
背景:我正在尝试用Go语言重写Step 1 in this guide
我有
- 一个 JWT 令牌(
tokenString
使用 RS256 算法可以查看 here) - 一个键(SSH RFC-4253 format 中的
key
)。
我正在尝试使用此密钥来验证 JWT 令牌。这是我的代码
import (
"fmt"
"github.com/golang-jwt/jwt/v4"
)
tokenString := "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE2MzQ3NzE5OTMsImV4cCI6MTY2NjMwNzk5MywiYXVkIjoiaHR0cHM6Ly9hcGkuYXV0aG9yaXpvbi5jb20vdjEvIiwiaXNzIjoiaHR0cHM6Ly9hdXRob3Jpem9uLmNvbS8iLCJzdWIiOiIzOGQ3ZjMxZTVjMzc0MGM5YjQwMmFlZTI4YzRhYjc3MCIsInBlZXJfdHlwZSI6ImNsaWVudCJ9.CNNNxkhN_xmpiiihrZS2fAJSaDCx9kpBXA9G8adh3BbGOs681381Jl63q9ZNgOXsf64ZLlVEtk6YirhaloZ05ZQIEGklXh98h7EPrvNWyAUwEzSHsoAUmmnuSG7EZn4xo7utNuk4UuFOwf63FwAJN6yU5X9gHwTXlf8JjGXAbFSj-QCmX-g1TfVRPwsGAJqM03thKVc-OiOuevJr04y1DnFx3kXiMeGgRMLpPzhYDgsUkCcyITIl1SIZXY_6ifwbPibqwpPy-r0bWi0hczNBJ_wxa3wElRm0Ib-XxldgpZNI3GD9RcTdzDW5jg5Upuf0ar8BKJDHjoWfGIoD93mRA4opT4gd5IMEU16w-d_UBPu0D96Q002kbq3Ou1_iKaS1APUKnCSfyfZK2o5W_OAYbD0FkkxpqTApRaoPws1a0yGpET6pYmQHUE2Jo-1ZH6uSnPf8kT1lwoyVJzs4ScOcjilApL4JXqV_SOGWA5WiFJG5qcigFlFWRYuVitjyXQTzsxIZnKaYsElf2KUOvXgeqHXGAsGsuYs-5fR7vQOdV02n_QOU0Kr_r13I3TP1OiaL2YSGxiNMqKmWM32KNYTAFYKrWoaz_TYSgrQSv1d96E0VgipxmAucM_-qw_sa1eVeUf8XLMGYl3x1Ssv8YY5eRPOWQ8FgAmAJq5MU1y11Dao"
key := "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDqSnARw5EZWAMSW3njVBfi6GAHe0N4rp51Uv2k107p5ZpF3gNPU0GTAQyhRBrwydaoHpeoI9Q2D3/8ornVUF+os6hiOltp885VPYrVSt6aN4vPj3UbuVykOhXoEln9CEbUb0dIfKCsiugHu94as38SE6DtVeRuQlGqpczIHdNkaFVRIx4hzeRmUZ2CyyA+8/kJgODeePP6hfHvoL2s45AC/VoffGEfskn6byC1okrfh3Fnb+ouJJYWgTqrQoQSx45Mz+NBwpBfeucAar02zD5chi/dXkwULBEF2hX9tqySuSqq544bK+ECygROuNTMYMAHPEhki1iroyHmxrer8sW/cEQcaqixB2Vu07ZWJgh2tMekLrjvRBbobervsXaXFDzjWPLY1OGsZqvSxuRSfCiQk645dzL/mXDj484FQGQ6pY6P9Tnc2alDs6yhtGb5vQtW5uFDRyfVpCBdvZjvpRXWEPHTEbKygKIy04QEi+QvZcInm6idBD00oIefJtsLvD+ZGyNM2L29gVP4klJoHZuXcXX1mxZFLMKvSIB9nl0+KRoMhaPaqyInPu8Amlp1+fkQBwaHfaVJFCPbGzrf580t7flQEmtLBX8k+4eCs6g5sTCLXWaVotsTFKspKz0nb7B/f6WEIjDpkZ4Xcgzx9nQwPThoywZi+PfykZjoh4RvcQ== homiao@LCNC02F10MAMD6R"
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte(key), nil
})
if err != nil {
fmt.Printf("%v", err)
}
但是,我得到了错误
key is of invalid type
任何有用的帮助或其他库都很棒!
我想你必须 return 一个 *rsa.PublicKey
而不是 jwt.KeyFunc
的 []byte。这是一个猜测,看你的关键字符串
而不是:
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte(key), nil
})
尝试:
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return jwt.ParseRSAPublicKeyFromPEM([]byte(key))
})
您还可以在签名方法上使用 switch case:
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
switch token.Method {
case jwt.SigningMethodHS256.Alg():
return []byte(key)
case jwt.SigningMethodRS512.Alg():
return jwt.ParseRSAPublicKeyFromPEM([]byte(key))
// and so on...
}
...
})