From b2972673ae7921ef7f9a39b1e9a0360815a0d56c Mon Sep 17 00:00:00 2001 From: Shikong <919411476@qq.com> Date: Wed, 5 Oct 2022 23:32:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20jwt=20&&=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=20models=20=E7=BB=93=E6=9E=84=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/app.go | 1 + app/jwt.go | 10 +++++ common/config/config.go | 6 +++ config.yaml | 6 +++ global/datasources.go | 2 +- global/jwt.go | 44 +++++++++++++++++++ go.mod | 1 + go.sum | 2 + model/{user => generic}/generate/config.yml | 0 .../generate/generate_test.go | 2 +- .../generate/reverse_generate.go | 0 model/{user => generic}/models/user.go | 0 services/user/user.go | 2 +- 13 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 app/jwt.go create mode 100644 global/jwt.go rename model/{user => generic}/generate/config.yml (100%) rename model/{user => generic}/generate/generate_test.go (88%) rename model/{user => generic}/generate/reverse_generate.go (100%) rename model/{user => generic}/models/user.go (100%) diff --git a/app/app.go b/app/app.go index 27c84c1..6922b5c 100644 --- a/app/app.go +++ b/app/app.go @@ -26,6 +26,7 @@ func Run() { reloadRedis(global.Config) reloadDataSources(global.Config) + reloadJwt(global.Config) App = reloadApp(global.Config) diff --git a/app/jwt.go b/app/jwt.go new file mode 100644 index 0000000..27f3083 --- /dev/null +++ b/app/jwt.go @@ -0,0 +1,10 @@ +package app + +import ( + "gofiber.study.skcks.cn/common/config" + "gofiber.study.skcks.cn/global" +) + +func reloadJwt(c *config.BasicConfig) { + global.JwtConfig = &c.Jwt +} diff --git a/common/config/config.go b/common/config/config.go index c1a82b5..502eaf6 100644 --- a/common/config/config.go +++ b/common/config/config.go @@ -4,6 +4,12 @@ type BasicConfig struct { Server ServerConfig `yaml:"server"` Mysql MysqlConfig `yaml:"mysql"` Redis RedisConfig `yaml:"redis"` + Jwt JwtConfig `yaml:"jwt"` +} + +type JwtConfig struct { + Secret string `yaml:"secret"` + Expire int64 `yaml:"expire"` } type MysqlConfig struct { diff --git a/config.yaml b/config.yaml index c4940bd..9f5818f 100644 --- a/config.yaml +++ b/config.yaml @@ -12,6 +12,12 @@ server: # 启用路由信息 /routes enableRoutesMsg: true +jwt: + # token 加密 + secret: 80ca7934863638942db04cec68e57bb4 + # token 过期时间 + expire: 7200 + mysql: # 自动同步数据库/表结构 autoSync: true diff --git a/global/datasources.go b/global/datasources.go index 2018ad8..9f54bfb 100644 --- a/global/datasources.go +++ b/global/datasources.go @@ -3,7 +3,7 @@ package global import ( "gofiber.study.skcks.cn/common/logger" models2 "gofiber.study.skcks.cn/model/casbin_model/models" - "gofiber.study.skcks.cn/model/user/models" + "gofiber.study.skcks.cn/model/generic/models" "xorm.io/xorm" "xorm.io/xorm/names" ) diff --git a/global/jwt.go b/global/jwt.go new file mode 100644 index 0000000..ca2ded1 --- /dev/null +++ b/global/jwt.go @@ -0,0 +1,44 @@ +package global + +import ( + "errors" + "github.com/golang-jwt/jwt/v4" + "gofiber.study.skcks.cn/common/config" + "time" +) + +var JwtConfig *config.JwtConfig + +type UserClaims struct { + Id string `json:"id"` + Account string `json:"account"` + + jwt.RegisteredClaims +} + +func GetToken(claims UserClaims) (string, error) { + iat := time.Now().Unix() + claims.IssuedAt = jwt.NewNumericDate(time.Unix(iat, 0)) + + expire := iat + JwtConfig.Expire + claims.ExpiresAt = jwt.NewNumericDate(time.Unix(expire, 0)) + + token := jwt.New(jwt.SigningMethodHS256) + return token.SignedString([]byte(JwtConfig.Secret)) +} + +func ParseToken(tokenStr string) (*UserClaims, error) { + token, err := jwt.ParseWithClaims(tokenStr, &UserClaims{}, func(token *jwt.Token) (interface{}, error) { + return JwtConfig.Secret, nil + }) + + if err != nil { + return nil, err + } + + if claims, ok := token.Claims.(*UserClaims); ok && token.Valid { + return claims, nil + } + + return nil, errors.New("无效的令牌") +} diff --git a/go.mod b/go.mod index 1cb20c5..31a09e5 100644 --- a/go.mod +++ b/go.mod @@ -30,6 +30,7 @@ require ( github.com/go-openapi/jsonreference v0.19.6 // indirect github.com/go-openapi/spec v0.20.4 // indirect github.com/go-openapi/swag v0.19.15 // indirect + github.com/golang-jwt/jwt/v4 v4.4.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/josharian/intern v1.0.0 // indirect diff --git a/go.sum b/go.sum index 0624139..5ead515 100644 --- a/go.sum +++ b/go.sum @@ -173,6 +173,8 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= diff --git a/model/user/generate/config.yml b/model/generic/generate/config.yml similarity index 100% rename from model/user/generate/config.yml rename to model/generic/generate/config.yml diff --git a/model/user/generate/generate_test.go b/model/generic/generate/generate_test.go similarity index 88% rename from model/user/generate/generate_test.go rename to model/generic/generate/generate_test.go index ddbaaf4..1d6eb8e 100644 --- a/model/user/generate/generate_test.go +++ b/model/generic/generate/generate_test.go @@ -3,7 +3,7 @@ package generate import ( "fmt" "gofiber.study.skcks.cn/common/utils" - "gofiber.study.skcks.cn/model/user/models" + "gofiber.study.skcks.cn/model/generic/models" "testing" ) diff --git a/model/user/generate/reverse_generate.go b/model/generic/generate/reverse_generate.go similarity index 100% rename from model/user/generate/reverse_generate.go rename to model/generic/generate/reverse_generate.go diff --git a/model/user/models/user.go b/model/generic/models/user.go similarity index 100% rename from model/user/models/user.go rename to model/generic/models/user.go diff --git a/services/user/user.go b/services/user/user.go index f4241a0..b5b9e11 100644 --- a/services/user/user.go +++ b/services/user/user.go @@ -3,7 +3,7 @@ package user import ( "errors" "gofiber.study.skcks.cn/global" - "gofiber.study.skcks.cn/model/user/models" + "gofiber.study.skcks.cn/model/generic/models" ) var (