gin 使用 jwt
作用
JWT 的主要作用是方便客戶端與伺服器之間的身份驗證。 使用JWT 可以在不需要每次登入的情況下,在客戶端與伺服器之間安全地傳遞封裝身份信息。 它還可以用於許多其他用途,例如串接多個服務,並將數據在服務間安全地傳遞。
簡單類說jwt作用在c/s模型中的通信過程中,用于驗證c端是否具有訪問權限。
一般在jwt中包含一些基本信息,包括用戶名,時間戳等??梢栽谝欢ǔ袚戏乐怪胤殴簟?/p>
注意:自jwt的內容部分,切勿包含任何如密碼等敏感信息,因為jwt是使用明文傳遞的。
在jwt中需要雙發線下協商一個所secret,在之后的請求中c端將使用這個secret最jwt做簽名,服務端使用這個secret驗證簽名,簽名的內容明文傳輸。
在gin中使用jwt
gin可以使用中間件的形式完成jwt校驗
// node config group nodeGroup := router.Group(methods.NodeTag, methods.JWTMiddleware()) initNodeConfigControllers(nodeGroup)
以上是在 NodeTag 這個請求組里面添加JWT校驗,這樣只作用與這一個請求組,也可以針對某個請求做校驗或全部請求都做校驗。
注意,一般將JWT的token放在請求頭里面,不要放在請求體里面
JWT校驗函數一般格式
func JWTMiddleware() gin.HandlerFunc {
return func(ctx *gin.Context) {
user_token := ctx.GetHeader("Authorization")
token, err := jwt.Parse(user_token, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
}
return []byte(configuration.GetToken()), nil // 此處GetToken得到的就是雙發協定好的secret
})
if err != nil {
log.Error("Token parsing error", "err", err)
ReturnErrorResp(ctx, http.StatusUnauthorized, PermissionError, err.Error())
ctx.Abort()
return
}
// 驗證解析后的令牌是否有效
if !token.Valid {
log.Error("Invalid token")
ReturnErrorResp(ctx, http.StatusUnauthorized, PermissionError, "token is ill")
ctx.Abort()
return
} else {
// 從令牌中提取有效載荷 (claims)
claims, ok := token.Claims.(jwt.MapClaims)
if ok {
if !claims.VerifyExpiresAt(time.Now().Unix(), true) {
log.Error("jwt token timeout")
ReturnErrorResp(ctx, http.StatusUnauthorized, PermissionError, "token is ill")
ctx.Abort()
return
}
} else {
log.Error("Invalid token claims")
ReturnErrorResp(ctx, http.StatusUnauthorized, PermissionError, "token is ill")
ctx.Abort()
return
}
}
ctx.Next()
}
}

浙公網安備 33010602011771號