如何在 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 函數:
提供此 getKey 函數,您可以在 Go 中使用 JWK 成功驗證 JWT 簽章。
以上是如何在 Go 中使用 JWK 驗證 JWT 簽名?的詳細內容。更多資訊請關注PHP中文網其他相關文章!