From 998ae4a9b951dbd9a59aada0bda471c6ccd1d4fa Mon Sep 17 00:00:00 2001 From: Shikong <919411476@qq.com> Date: Sun, 26 Feb 2023 23:48:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=85=B7=E5=8C=85=E8=B0=83=E6=95=B4?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=20jwt=20nanoid=20=E9=85=8D=E7=BD=AE=20?= =?UTF-8?q?=E5=8F=8A=20=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../golang/matrix-middle-service/.gitignore | 2 +- backend/golang/matrix-middle-service/go.mod | 2 + backend/golang/matrix-middle-service/go.sum | 4 ++ .../matrix-middle-service/internel/app/app.go | 4 +- .../pkg/config/config.go | 24 +++++++-- .../pkg/config/{ => database}/datasources.go | 2 +- .../pkg/config/jwt/jwt.go | 6 +++ .../pkg/config/nanoid/nanoid.go | 6 +++ .../pkg/config/sonyflake/sonyflake.go | 7 +++ .../pkg/database/database.go | 6 +-- .../pkg/database/driver/mysql/mysql.go | 4 +- .../pkg/utils/jwt/jwt.go | 51 +++++++++++++++++++ .../pkg/utils/nanoid/nanoid.go | 18 +++++++ .../pkg/utils/sonyflake/sonyflake.go | 10 ++-- 14 files changed, 130 insertions(+), 16 deletions(-) rename backend/golang/matrix-middle-service/pkg/config/{ => database}/datasources.go (93%) create mode 100644 backend/golang/matrix-middle-service/pkg/config/jwt/jwt.go create mode 100644 backend/golang/matrix-middle-service/pkg/config/nanoid/nanoid.go create mode 100644 backend/golang/matrix-middle-service/pkg/config/sonyflake/sonyflake.go create mode 100644 backend/golang/matrix-middle-service/pkg/utils/jwt/jwt.go create mode 100644 backend/golang/matrix-middle-service/pkg/utils/nanoid/nanoid.go diff --git a/backend/golang/matrix-middle-service/.gitignore b/backend/golang/matrix-middle-service/.gitignore index 7c9b6d6..093487d 100644 --- a/backend/golang/matrix-middle-service/.gitignore +++ b/backend/golang/matrix-middle-service/.gitignore @@ -94,4 +94,4 @@ fabric.properties # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser -./config.toml +config.toml diff --git a/backend/golang/matrix-middle-service/go.mod b/backend/golang/matrix-middle-service/go.mod index 6642518..283ac34 100644 --- a/backend/golang/matrix-middle-service/go.mod +++ b/backend/golang/matrix-middle-service/go.mod @@ -10,6 +10,8 @@ require ( github.com/go-sql-driver/mysql v1.7.0 github.com/gofiber/fiber/v2 v2.42.0 github.com/gofiber/swagger v0.1.9 + github.com/golang-jwt/jwt/v4 v4.5.0 + github.com/matoous/go-nanoid v1.5.0 github.com/mitchellh/mapstructure v1.5.0 github.com/pelletier/go-toml/v2 v2.0.6 github.com/sony/sonyflake v1.1.0 diff --git a/backend/golang/matrix-middle-service/go.sum b/backend/golang/matrix-middle-service/go.sum index 933b5d0..78ab35e 100644 --- a/backend/golang/matrix-middle-service/go.sum +++ b/backend/golang/matrix-middle-service/go.sum @@ -166,6 +166,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.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/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= @@ -362,6 +364,8 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/matoous/go-nanoid v1.5.0 h1:VRorl6uCngneC4oUQqOYtO3S0H5QKFtKuKycFG3euek= +github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= diff --git a/backend/golang/matrix-middle-service/internel/app/app.go b/backend/golang/matrix-middle-service/internel/app/app.go index f19c3c8..ca601d9 100644 --- a/backend/golang/matrix-middle-service/internel/app/app.go +++ b/backend/golang/matrix-middle-service/internel/app/app.go @@ -9,6 +9,7 @@ import ( "matrix-middle-service/pkg/database" "matrix-middle-service/pkg/logger" fib "matrix-middle-service/pkg/utils/fiber" + "matrix-middle-service/pkg/utils/nanoid" "matrix-middle-service/pkg/utils/sonyflake" "time" ) @@ -63,7 +64,8 @@ func InitApp(conf *config.Conf) { logger.Log().Fatal(err) } - sonyflake.Init() + sonyflake.Init(conf.SonyFlake) + nanoid.Init(conf.NanoIdConfig) } func Shutdown() { diff --git a/backend/golang/matrix-middle-service/pkg/config/config.go b/backend/golang/matrix-middle-service/pkg/config/config.go index 879e743..d06a4d1 100644 --- a/backend/golang/matrix-middle-service/pkg/config/config.go +++ b/backend/golang/matrix-middle-service/pkg/config/config.go @@ -1,12 +1,19 @@ package config import ( + "matrix-middle-service/pkg/config/database" + "matrix-middle-service/pkg/config/jwt" + "matrix-middle-service/pkg/config/nanoid" + "matrix-middle-service/pkg/config/sonyflake" "matrix-middle-service/pkg/database/driver/mysql/conf" ) type Conf struct { - Server *ServerConfig `yaml:"server"` - DataSources []interface{} `yaml:"mysql"` + Server *ServerConfig `comment:"服务器配置"` + DataSources []interface{} `comment:"数据源配置"` + NanoIdConfig *nanoid.Config `comment:"nanoId 配置"` + JwtConfig *jwt.Config `comment:"jwt 配置"` + SonyFlake *sonyflake.Config `comment:"sonyFlake 配置"` } type ServerConfig struct { @@ -33,12 +40,23 @@ func DefaultConfig() *Conf { EnableRoutesMsg: false, }, DataSources: []interface{}{ - DataSourcesType[any]{ + database.DataSourcesType[any]{ Type: "mysql", Config: conf.NewMysqlConfig([]string{ "root:12341234@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai", }, true), }, }, + NanoIdConfig: &nanoid.Config{ + Sequence: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", + Length: 36, + }, + JwtConfig: &jwt.Config{ + Secret: "1234567890", + Expire: 7200, + }, + SonyFlake: &sonyflake.Config{ + StartTime: sonyflake.DefaultSonyFlakeStartTime, + }, } } diff --git a/backend/golang/matrix-middle-service/pkg/config/datasources.go b/backend/golang/matrix-middle-service/pkg/config/database/datasources.go similarity index 93% rename from backend/golang/matrix-middle-service/pkg/config/datasources.go rename to backend/golang/matrix-middle-service/pkg/config/database/datasources.go index 74295f0..4c086b4 100644 --- a/backend/golang/matrix-middle-service/pkg/config/datasources.go +++ b/backend/golang/matrix-middle-service/pkg/config/database/datasources.go @@ -1,4 +1,4 @@ -package config +package database type DataSources = []DataSourcesType[any] diff --git a/backend/golang/matrix-middle-service/pkg/config/jwt/jwt.go b/backend/golang/matrix-middle-service/pkg/config/jwt/jwt.go new file mode 100644 index 0000000..ee046ae --- /dev/null +++ b/backend/golang/matrix-middle-service/pkg/config/jwt/jwt.go @@ -0,0 +1,6 @@ +package jwt + +type Config struct { + Secret string `comment:"密钥"` + Expire int64 `comment:"超时时间(秒)"` +} diff --git a/backend/golang/matrix-middle-service/pkg/config/nanoid/nanoid.go b/backend/golang/matrix-middle-service/pkg/config/nanoid/nanoid.go new file mode 100644 index 0000000..c0aa439 --- /dev/null +++ b/backend/golang/matrix-middle-service/pkg/config/nanoid/nanoid.go @@ -0,0 +1,6 @@ +package nanoid + +type Config struct { + Sequence string `comment:"字符序列"` + Length int `comment:"生成 id 长度"` +} diff --git a/backend/golang/matrix-middle-service/pkg/config/sonyflake/sonyflake.go b/backend/golang/matrix-middle-service/pkg/config/sonyflake/sonyflake.go new file mode 100644 index 0000000..7b07512 --- /dev/null +++ b/backend/golang/matrix-middle-service/pkg/config/sonyflake/sonyflake.go @@ -0,0 +1,7 @@ +package sonyflake + +const DefaultSonyFlakeStartTime = "2023-01-01" + +type Config struct { + StartTime string `comment:"sonyFlake 起始生成时间 (格式: 2023-01-01)"` +} diff --git a/backend/golang/matrix-middle-service/pkg/database/database.go b/backend/golang/matrix-middle-service/pkg/database/database.go index b3aa95e..7d24312 100644 --- a/backend/golang/matrix-middle-service/pkg/database/database.go +++ b/backend/golang/matrix-middle-service/pkg/database/database.go @@ -2,14 +2,14 @@ package database import ( "github.com/mitchellh/mapstructure" - "matrix-middle-service/pkg/config" + "matrix-middle-service/pkg/config/database" "matrix-middle-service/pkg/logger" ) var SupportDataSources = make(map[string]InitDSFn) var drivers []DataBase -type InitDSFn = func(conf config.DataSourcesType[any]) DataBase +type InitDSFn = func(conf database.DataSourcesType[any]) DataBase type DataBase interface { Open() error @@ -21,7 +21,7 @@ func Init(conf []interface{}) { logger.Log().Debug("[数据源] 初始化") for _, item := range conf { - dst := config.DataSourcesType[any]{} + dst := database.DataSourcesType[any]{} _ = mapstructure.Decode(item, &dst) fn, ok := SupportDataSources[dst.Type] diff --git a/backend/golang/matrix-middle-service/pkg/database/driver/mysql/mysql.go b/backend/golang/matrix-middle-service/pkg/database/driver/mysql/mysql.go index 4e75895..c2e4474 100644 --- a/backend/golang/matrix-middle-service/pkg/database/driver/mysql/mysql.go +++ b/backend/golang/matrix-middle-service/pkg/database/driver/mysql/mysql.go @@ -5,7 +5,7 @@ import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/mitchellh/mapstructure" - "matrix-middle-service/pkg/config" + database2 "matrix-middle-service/pkg/config/database" "matrix-middle-service/pkg/database" "matrix-middle-service/pkg/database/driver/mysql/conf" "matrix-middle-service/pkg/logger" @@ -23,7 +23,7 @@ func init() { logger.Log().Debug("添加 mysql 数据源支持") }) - database.Register("mysql", func(c config.DataSourcesType[any]) database.DataBase { + database.Register("mysql", func(c database2.DataSourcesType[any]) database.DataBase { mc := &conf.Config{} _ = mapstructure.Decode(c.Config, &mc) diff --git a/backend/golang/matrix-middle-service/pkg/utils/jwt/jwt.go b/backend/golang/matrix-middle-service/pkg/utils/jwt/jwt.go new file mode 100644 index 0000000..5f3c086 --- /dev/null +++ b/backend/golang/matrix-middle-service/pkg/utils/jwt/jwt.go @@ -0,0 +1,51 @@ +package jwt + +import ( + "errors" + "github.com/golang-jwt/jwt/v4" + jwt2 "matrix-middle-service/pkg/config/jwt" + "time" +) + +var JwtConfig *jwt2.Config + +// UserClaims +// @Param id body string true +// @Param account body string true +type UserClaims struct { + Id string `json:"id"` + Account string `json:"account"` + Identify string `json:"identify"` + + jwt.RegisteredClaims `swaggerignore:"true"` +} + +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) + + token.Claims = claims + + 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 []byte(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/backend/golang/matrix-middle-service/pkg/utils/nanoid/nanoid.go b/backend/golang/matrix-middle-service/pkg/utils/nanoid/nanoid.go new file mode 100644 index 0000000..74956c3 --- /dev/null +++ b/backend/golang/matrix-middle-service/pkg/utils/nanoid/nanoid.go @@ -0,0 +1,18 @@ +package nanoid + +import ( + gonanoid "github.com/matoous/go-nanoid" + "matrix-middle-service/pkg/config/nanoid" + "matrix-middle-service/pkg/logger" +) + +var config *nanoid.Config + +func Init(conf *nanoid.Config) { + logger.Log().Debug("[nanoid] 初始化") + config = conf +} + +func GetNanoId() (string, error) { + return gonanoid.Generate(config.Sequence, config.Length) +} diff --git a/backend/golang/matrix-middle-service/pkg/utils/sonyflake/sonyflake.go b/backend/golang/matrix-middle-service/pkg/utils/sonyflake/sonyflake.go index 2ae0314..64dbb10 100644 --- a/backend/golang/matrix-middle-service/pkg/utils/sonyflake/sonyflake.go +++ b/backend/golang/matrix-middle-service/pkg/utils/sonyflake/sonyflake.go @@ -2,17 +2,17 @@ package sonyflake import ( "github.com/sony/sonyflake" - + sf "matrix-middle-service/pkg/config/sonyflake" + "matrix-middle-service/pkg/logger" "time" ) -const DefaultSonyFlakeStartTime = "2023-01-01" - var generator *sonyflake.Sonyflake -func Init() { +func Init(config *sf.Config) { + logger.Log().Debug("[sonyFlake] 初始化") var s sonyflake.Settings - s.StartTime, _ = time.Parse("2006-01-02", DefaultSonyFlakeStartTime) + s.StartTime, _ = time.Parse("2006-01-02", config.StartTime) generator = sonyflake.NewSonyflake(s) }