为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Go Fiber 中间件的 AWS Cognito JWT 验证(获取“密钥类型无效”)

使用 Go Fiber 中间件的 AWS Cognito JWT 验证(获取“密钥类型无效”)

Go
慕妹3146593 2023-02-14 14:54:31
当我尝试在我的中间件中验证基于 Cognito 的 JWT 时,我收到“密钥类型无效”。目前我在设置 Fiber 应用程序时像这样设置中间件:// read the "jwks.json" that I got from AWS locallysigningKey, err := ioutil.ReadFile("./jwks.json")if err != nil {    log.Fatal("Error when opening file: ", err)}// pass in the signing key when middle ware is createdapp.Get("/api", middleware.Protected(signingKey), handlers.ReadSomeData)然后我的中间件看起来像这样,其中大部分来自 Go Fiber 的 JWT 示例存储库。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”
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

事实证明,如果您向 fiber 提供密钥的 url,fiber 具有提取 jwks.json 数据的内置功能。可能还有一种方法可以让它加载本地文件,但是使用 AWS 密钥您通常不会这样做 - 密钥可能会根据您所处的环境而改变 - 生产或测试。

您需要知道您的 AWS 用户池区域和该用户池的 ID。这通常在用户池设置视图中提供,但您可以根据 AWS 文档中提供的以下示例轻松想出它:

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json

有关更多信息,请参阅:AWS:验证 JSON 网络令牌

这是一个让它与 AWS Cognito JWT url 一起工作的简单示例:

 authMiddleware := jwtware.New(jwtware.Config{

        TokenLookup: "header:Authorization",

        AuthScheme:  "Bearer",

        KeySetURLs: []string{

            "https://cognito-idp.some-region-1.amazonaws.com/some-region-1_MYUserPoolId/.well-known/jwks.json",

        },

    })


    // Match any route

    app.Use(authMiddleware, func(c *fiber.Ctx) error {

        return c.SendString("🥇 Yay!")

    })


    log.Fatal(app.Listen(":3000"))

您现在应该能够使用这样的请求对其进行测试:


curl --location --request GET 'http://127.0.0.1:3000' \

--header 'Authorization: Bearer MyAWSJWTToken..'

或者使用任何 HTTP 客户端(如 Postman)。您必须在 Authorization 标头中提供您的 JWT。


也可以看看:


查看完整回答
反对 回复 2023-02-14
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信