當我嘗試在中間件中驗證基于 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 示例 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",
})
}
但是現在我的錯誤是“Unexpected jwt key id=XXXXXXXXXXXX”
uj5u.com熱心網友回復:
事實證明,如果您向其提供密鑰的 url,則 Fiber 具有提取 jwks.json 資料的內置功能。可能還有一種方法可以使其加載本地檔案,但是使用 AWS 密鑰通常不會這樣做 - 密鑰可能會根據您所處的環境而變化 - 生產或測驗。
您需要知道您的 AWS 用戶池區域和該用戶池的 ID。這通常在用戶池設定視圖中提供,但您可以根據 AWS 檔案中提供的以下示例輕松提出它:
https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
有關更多資訊,請參閱:AWS:驗證 JSON Web 令牌
這是一個使用 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 中間件
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/508653.html
標籤:去亚马逊认知光纤
下一篇:如何在GORM中檢索非空關聯的行
