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

当我尝试在我的中间件中验证基于 Cognito 的 JWT 时,我收到“密钥类型无效”。目前我在设置 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 示例存储库。


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”


慕妹3146593
浏览 163回答 1
1回答

狐的传说

事实证明,如果您向 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。也可以看看:用于 Fiber 的 JWT 中间件
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go