首頁 >後端開發 >Golang >如何在 Go 中使用 JWK 驗證 JWT 簽名?

如何在 Go 中使用 JWK 驗證 JWT 簽名?

Linda Hamilton
Linda Hamilton原創
2024-12-28 17:00:12958瀏覽

How to Verify JWT Signatures Using JWKs in Go?

如何在 Go 中使用 JWK 驗證 JWT 簽章?

驗證 JWT 的一個挑戰是驗證簽章。對於 JWK 和 Go 語言尤其如此。

問題

解碼器允許我們解析 JWT。然而,驗證簽名,尤其是使用 JWK 驗證簽名,帶來了不同的挑戰。以下是常見錯誤的範例:

type myClaims struct {
    jwt.StandardClaims
}

func main() {
    claims := &myClaims{}

    _, err := jwt.ParseWithClaims("ey...", claims, getKey)
    if err != nil {
        log.Fatal(err)
    }
}

錯誤:在令牌中找不到金鑰「kid」

解決方案

要解決此問題,我們必須提供一個檢索公鑰的Keyfunc。以下程式碼示範了一個解決方案:

const jwksURL = "https://companyx.okta.com/oauth2/v1/keys"

func getKey(token *jwt.Token) (interface{}, error) {
    // TODO: Cache the response to avoid repeated HTTP requests
    set, err := jwk.FetchHTTP(jwksURL)
    if err != nil {
        return nil, err
    }
    keyID, ok := token.Header["kid"].(string)
    if !ok {
        return nil, errors.New("expecting JWT header to have string kid")
    }
    if key := set.LookupKeyID(keyID); len(key) == 1 {
        return key[0].Materialize()
    }
    return nil, fmt.Errorf("unable to find key %q", keyID)
}

此 getKey 函數:

  1. 從提供的 URL 取得公鑰。
  2. 從JWT 標頭。
  3. 使用 key 找出 key ID。
  4. 將金鑰具體化為 jwt-go 可用於驗證的介面。

提供此 getKey 函數,您可以在 Go 中使用 JWK 成功驗證 JWT 簽章。

以上是如何在 Go 中使用 JWK 驗證 JWT 簽名?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn