[英]Golang JWT is invalid with go-jwt-middleware
得到JWT is invalid
對"github.com/auth0/go-jwt-middleware/v2"
的新版本無效
使用"github.com/golang-jwt/jwt/v4"
插件成功生成令牌,並嘗試根據請求使用它但在中間件上被拒絕,我猜是go-jwt-middleware
中的問題。 實施中有一些缺失,也許有人已經實施並想分享
這是代碼:
type Claims struct {
Username string `json:"username"`
Role string `json:"role"`
Id string `json:"id"`
Avatar string `json:"avatar"`
jwt.StandardClaims
}
func (c *Claims) Validate(ctx context.Context) error {
return nil
}
var jwtKey = []byte("secret")
func Middleware(h http.Handler) http.Handler {
keyFunc := func(ctx context.Context) (interface{}, error) {
return jwtKey, nil
}
customClaims := func() validator.CustomClaims {
return &Claims{}
}
jwtValidator, err := validator.New(
keyFunc,
validator.HS256,
"issuer",
[]string{"audience"},
validator.WithCustomClaims(customClaims),
validator.WithAllowedClockSkew(30*time.Second),
)
if err != nil {
log.Fatalf("Failed to set up the validator: %v", err)
}
// Set up the middleware.
middleware := jwtmiddleware.New(jwtValidator.ValidateToken)
return middleware.CheckJWT(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, token, err := ParseToken(r)
if !token.Valid || err != nil {
w.WriteHeader(401)
w.Write([]byte("Unauthorized"))
return
}
h.ServeHTTP(w, r)
}))
}
func GenerateToken(id string, username string, role string, avatar string) (string, int64, error) {
expirationTime := time.Now().Add(time.Hour * 24).Unix()
claims := &Claims{
Id: id,
Username: username,
Role: role,
Avatar: avatar,
StandardClaims: jwt.StandardClaims{
ExpiresAt: expirationTime,
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString(jwtKey)
if err != nil {
return "", 0, err
}
return tokenString, expirationTime, nil
}
而且我沒有找到任何關於驗證器上的issuer
者 && audience
選項的價值的文檔。 只需按照示例進行操作:
jwtValidator, err := validator.New(
keyFunc,
validator.HS256,
"issuer", <------------ issuer
[]string{"audience"}, <------------ audience
validator.WithCustomClaims(customClaims),
validator.WithAllowedClockSkew(30*time.Second),
)
Issuer: issuerURL,
Audience: audience,
受眾值是一個字符串——通常是被訪問資源的基地址。 例如,哪些服務、API、產品應該接受這個令牌作為服務的訪問令牌。 Stack 交換網站不應接受對 Stackoveflow 有效的令牌,即使它們都有相同的發行者,它們也會有不同的受眾。
頒發者值是這樣的字符串https://<issuer-url>/
誰創建了令牌。 類似於 GitHub 或 LinkedIn 發布的令牌,這可以通過使用 OpenID 配置端點來驗證
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.