dragonfly/manager/middlewares/jwt.go

67 lines
1.6 KiB
Go

package middlewares
import (
"net/http"
"time"
"d7y.io/dragonfly/v2/manager/handlers"
"d7y.io/dragonfly/v2/manager/types"
jwt "github.com/appleboy/gin-jwt/v2"
"github.com/gin-gonic/gin"
)
func Jwt(h *handlers.Handlers) (*jwt.GinJWTMiddleware, error) {
authMiddleware, err := jwt.New(&jwt.GinJWTMiddleware{
Realm: "Dragonfly Zone",
Key: []byte("Dragonfly Secret Key"),
Timeout: time.Hour,
MaxRefresh: time.Hour,
Authenticator: func(c *gin.Context) (interface{}, error) {
var loginInfos types.LoginRequest
if err := c.ShouldBind(&loginInfos); err != nil {
return "", jwt.ErrMissingLoginValues
}
userInfo, err := h.Service.Login(loginInfos)
if err != nil {
return "", jwt.ErrFailedAuthentication
}
return map[string]interface{}{
"name": userInfo.Name,
}, nil
},
LoginResponse: func(c *gin.Context, code int, token string, expire time.Time) {
c.JSON(http.StatusOK, gin.H{
"token": token,
"expire": expire.Format(time.RFC3339),
})
},
PayloadFunc: func(data interface{}) jwt.MapClaims {
if v, ok := data.(map[string]interface{}); ok {
return jwt.MapClaims{
"name": v["name"],
}
}
return jwt.MapClaims{}
},
Unauthorized: func(c *gin.Context, code int, message string) {
c.JSON(code, gin.H{
"message": message,
})
},
TokenLookup: "header: Authorization, query: token, cookie: jwt",
TokenHeadName: "Bearer",
TimeFunc: time.Now,
SendCookie: true,
CookieHTTPOnly: true,
})
if err != nil {
return nil, err
}
return authMiddleware, nil
}