diff --git a/go.mod b/go.mod index c7073e4..0bb9f34 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,12 @@ module message-nest go 1.20 require ( - github.com/dgrijalva/jwt-go v3.1.0+incompatible github.com/gin-gonic/gin v1.9.1 github.com/go-ini/ini v1.32.1-0.20180214101753-32e4be5f41bb github.com/go-playground/locales v0.14.1 github.com/go-playground/universal-translator v0.18.1 github.com/go-playground/validator/v10 v10.16.0 + github.com/golang-jwt/jwt/v5 v5.2.0 github.com/google/uuid v1.5.0 github.com/jinzhu/gorm v0.0.0-20180213101209-6e1387b44c64 github.com/robfig/cron/v3 v3.0.1 diff --git a/go.sum b/go.sum index 9833b3d..a510f1c 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.0.0-20190920000552-128d9f4ae1cd h1:tXCgEGHPT4XELDS7nB0OBb9968yCOd+MnyNf+6m1u40= github.com/denisenkom/go-mssqldb v0.0.0-20190920000552-128d9f4ae1cd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/dgrijalva/jwt-go v3.1.0+incompatible h1:FFziAwDQQ2dz1XClWMkwvukur3evtZx7x/wMHKM1i20= -github.com/dgrijalva/jwt-go v3.1.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= @@ -37,6 +35,8 @@ github.com/go-sql-driver/mysql v1.4.1-0.20190510102335-877a9775f068 h1:q2kwd9Bcg github.com/go-sql-driver/mysql v1.4.1-0.20190510102335-877a9775f068/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= diff --git a/main.go b/main.go index ec5f2ab..034bcf5 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,6 @@ import ( "embed" "fmt" "message-nest/pkg/table" - "message-nest/pkg/util" "message-nest/service/cron_service" "message-nest/service/env_service" "message-nest/service/send_message_service" @@ -30,7 +29,6 @@ func init() { setting.Setup() models.Setup() logging.Setup() - util.Setup() table.Setup() env_service.Setup() cron_service.Setup() diff --git a/middleware/jwt.go b/middleware/jwt.go index 742d6db..54095e1 100644 --- a/middleware/jwt.go +++ b/middleware/jwt.go @@ -1,7 +1,8 @@ package middleware import ( - "github.com/dgrijalva/jwt-go" + "errors" + "github.com/golang-jwt/jwt/v5" "net/http" "github.com/gin-gonic/gin" @@ -35,8 +36,12 @@ func JWT() gin.HandlerFunc { } else { claims, err := util.ParseToken(token) if err != nil { - switch err.(*jwt.ValidationError).Errors { - case jwt.ValidationErrorExpired: + switch { + case errors.Is(err, jwt.ErrTokenMalformed): + code = e.ERROR_AUTH + case errors.Is(err, jwt.ErrTokenSignatureInvalid): + code = e.ERROR_AUTH_CHECK_TOKEN_FAIL + case errors.Is(err, jwt.ErrTokenExpired) || errors.Is(err, jwt.ErrTokenNotValidYet): code = e.ERROR_AUTH_CHECK_TOKEN_TIMEOUT default: code = e.ERROR_AUTH_CHECK_TOKEN_FAIL diff --git a/pkg/util/jwt.go b/pkg/util/jwt.go index ff59624..d0f2b47 100644 --- a/pkg/util/jwt.go +++ b/pkg/util/jwt.go @@ -1,50 +1,47 @@ package util import ( + "fmt" + "github.com/golang-jwt/jwt/v5" + "message-nest/pkg/setting" "time" - - "github.com/dgrijalva/jwt-go" ) -var jwtSecret []byte - -type Claims struct { +type UserClaims struct { Username string `json:"username"` Password string `json:"password"` - jwt.StandardClaims + + jwt.RegisteredClaims } -// GenerateToken generate tokens used for auth func GenerateToken(username, password string) (string, error) { - nowTime := time.Now() - expireTime := nowTime.Add(1 * 24 * time.Hour) - - claims := Claims{ - username, - EncodeMD5(password), - jwt.StandardClaims{ - ExpiresAt: expireTime.Unix(), + expHours := 1 * 24 * time.Hour + SetClaims := UserClaims{ + Username: username, + Password: EncodeMD5(password), + RegisteredClaims: jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(time.Now().Add(expHours)), + IssuedAt: jwt.NewNumericDate(time.Now()), + NotBefore: jwt.NewNumericDate(time.Now()), Issuer: "message-nest", }, } - tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - token, err := tokenClaims.SignedString(jwtSecret) - + tokenStruct := jwt.NewWithClaims(jwt.SigningMethodHS256, SetClaims) + token, err := tokenStruct.SignedString([]byte(setting.AppSetting.JwtSecret)) return token, err } -// ParseToken parsing token -func ParseToken(token string) (*Claims, error) { - tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) { - return jwtSecret, nil +func ParseToken(tokenString string) (*UserClaims, error) { + tokenObj, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) { + return []byte(setting.AppSetting.JwtSecret), nil }) - - if tokenClaims != nil { - if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid { - return claims, nil - } + if err != nil { + return nil, err + } + if claims, ok := tokenObj.Claims.(*UserClaims); ok && tokenObj.Valid { + return claims, nil + } else { + return nil, fmt.Errorf("invalid token") } - - return nil, err } diff --git a/pkg/util/util.go b/pkg/util/util.go deleted file mode 100644 index bd23b84..0000000 --- a/pkg/util/util.go +++ /dev/null @@ -1,10 +0,0 @@ -package util - -import ( - "message-nest/pkg/setting" -) - -// Setup Initialize the util -func Setup() { - jwtSecret = []byte(setting.AppSetting.JwtSecret) -} diff --git a/web/src/constant.js b/web/src/constant.js index 00c817a..004f2c8 100644 --- a/web/src/constant.js +++ b/web/src/constant.js @@ -52,7 +52,7 @@ const CONSTANT = { label: '自定义', inputs: [ { subLabel: 'webhook地址', value: '', col: 'webhook', desc: "自定义webhook地址" }, - { subLabel: '请求体', value: '', col: 'body', desc: "请求体, text内容请使用 TEXT 进行占位\n例如:{\"message\": \"TEXT\", \"other_field\": \"field_data\"}", isTextArea: true}, + { subLabel: '请求体', value: '', col: 'body', desc: "请求体, text内容请使用 TEXT 进行占位\n例如:{\"message\": \"TEXT\", \"foo\": \"bar\"}", isTextArea: true }, { subLabel: '渠道名', value: '', col: 'name', desc: "想要设置的渠道名字" }, ], tips: { @@ -75,6 +75,4 @@ CONSTANT.WAYS_DATA.forEach(element => { CONSTANT.WAYS_DATA_MAP[element.type] = element }); -console.log('xxxxxxxx', CONSTANT.WAYS_DATA_MAP) - export { CONSTANT } \ No newline at end of file diff --git a/web/src/views/tabsTools/sendLogs/sendLogs.vue b/web/src/views/tabsTools/sendLogs/sendLogs.vue index da8c12a..857e54d 100644 --- a/web/src/views/tabsTools/sendLogs/sendLogs.vue +++ b/web/src/views/tabsTools/sendLogs/sendLogs.vue @@ -22,7 +22,8 @@ @@ -47,7 +48,7 @@ import { reactive, toRefs, onMounted } from 'vue' import { request } from '../../../api/api' import { copyToClipboard } from '../../../util/clipboard.js'; -import { useRouter, useRoute } from 'vue-router'; +import { useRoute } from 'vue-router'; import { CONSTANT } from '@/constant' export default {