当我尝试在中间件中验证基于Cognito的JWT时,我得到“key is of invalid type”(密钥类型无效)。目前,我在安装Fiber应用程序时是这样设置中间件的:
// read the "jwks.json" that I got from AWS locally
signingKey, err := ioutil.ReadFile("./jwks.json")
if err != nil {
log.Fatal("Error when opening file: ", err)
}
// pass in the signing key when middle ware is created
app.Get("/api", middleware.Protected(signingKey), handlers.ReadSomeData)
然后我的中间件看起来像这样,其中大部分来自Go Fiber的JWT示例repo。
func Protected(signingKey []byte) func(*fiber.Ctx) error {
return jwtware.New(jwtware.Config{
SigningKey: signingKey,
ErrorHandler: jwtError,
SigningMethod: "RS256",
})
}
func jwtError(c *fiber.Ctx, err error) error {
if err.Error() == "Missing or malformed JWT" {
c.Status(fiber.StatusBadRequest)
return c.JSON(fiber.Map{"status": "error", "message": err.Error(), "data": nil})
} else {
c.Status(fiber.StatusUnauthorized)
return c.JSON(fiber.Map{"status": "error", "message": err.Error(), "data": nil})
}
}
在得到答案后,我尝试使用“SigningKeys”参数,但类型不匹配,因此我最终阅读了jwks json文件,如下所示:
func Protected() func(*fiber.Ctx) error {
signingKey, err := os.ReadFile("./jwks.json")
if err != nil {
}
x := make(map[string]interface{})
json.Unmarshal(signingKey, &x)
return jwtware.New(jwtware.Config{
SigningKeys: x,
ErrorHandler: jwtError,
SigningMethod: "RS256",
})
}
但是,现在我的错误是“意外的jwt密钥ID=XXXXXXXXXXXX”
2条答案
按热度按时间bxfogqkk1#
事实证明fiber有一个内置的功能,如果你给它一个键的url,它就可以拉取jwks.json数据。也许还有一个方法可以让它加载一个本地文件,但是对于AWS键,你通常不会这样做--键可能会根据你在生产或测试中的环境而改变。
您需要知道您的AWS用户池区域和该用户池的ID。这通常在用户池设置视图中提供,但您可以根据AWS文档中提供的以下示例轻松找到它:
https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
更多信息请参见:AWS: Verifying a JSON web token
下面是一个简单的例子,让它与AWS Cognito JWT url一起工作:
现在您应该能够使用如下请求来测试它:
或者使用任何HTTP客户机(如Postman)。您必须在Authorization头中提供您的JWT。
另见:
6l7fqoea2#
github.com/gofiber/jwt
项目使用github.com/MicahParks/keyfunc
作为JWK集客户端。它也has not updated它,因为github.com/MicahParks/keyfunc
是在预发布。我建议不要使用该项目在其目前的状态,由于已知的错误。下面是一个从AWS Cognito解析JWK集合,然后使用该集合中的键直接从
github.com/Micahparks/keyfunc
项目解析JWT的示例:下面是
github.com/MicahParks/keyfunc
项目中此示例的链接:link