
WebGin简单框架-pkg/myJWT/snowflake
Web目录结构
C:. ├─.idea │ └─dictionaries ├─controllers ├─dao │ ├─mysql │ └─redis ├─dist │ └─static │ ├─css │ ├─fonts │ └─js ├─logger ├─logic ├─models ├─pkg │ ├─myJWT │ └─snowflake ├─routers ├─setting └─main.go
1.my_jwt.go
my_jwt.go
package myJWT import ( "errors" "time" "github.com/spf13/viper" "github.com/dgrijalva/jwt-go" ) // MyClaims 自定义声明结构体并内嵌jwt.StandardClaims // jwt包自带的jwt.StandardClaims只包含了官方字段 // 我们这里需要额外记录一个UserID字段,所以要自定义结构体 // 如果想要保存更多信息,都可以添加到这个结构体中 type MyClaims struct { UserID uint64 `json:"user_id"` //Username string `json:"username"` jwt.StandardClaims } // GenToken 生成JWT func GenToken(userID uint64) (string, error) { // 创建一个我们自己的声明 c := MyClaims{ userID, // 自定义字段 jwt.StandardClaims{ ExpiresAt: time.Now().Add( time.Second * time.Duration(viper.GetInt("jwt.expire_seconds"))).Unix(), // 过期时间 Issuer: viper.GetString("app.name"), // 签发人 }, } // 使用指定的签名方法创建签名对象 token := jwt.NewWithClaims(jwt.SigningMethodHS256, c) // 使用指定的secret签名并获得完整的编码后的字符串token return token.SignedString([]byte(viper.GetString("jwt.secret"))) } // ParseToken 解析JWT func ParseToken(tokenString string) (*MyClaims, error) { // 解析token token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (i interface{}, err error) { return []byte(viper.GetString("jwt.secret")), nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(*MyClaims); ok && token.Valid { // 校验token return claims, nil } return nil, errors.New("invalid token") }
2.snowflake.go
snowflake.go
package snowflake import ( "fmt" "time" "github.com/sony/sonyflake" ) var ( sonyFlake *sonyflake.Sonyflake sonyMachineID uint16 ) func getMachineID() (uint16, error) { return sonyMachineID, nil } // Init 需传入当前的机器ID func Init(machineId uint16) (err error) { sonyMachineID = machineId t, _ := time.Parse("2006-01-02", "2020-01-01") settings := sonyflake.Settings{ StartTime: t, MachineID: getMachineID, } sonyFlake = sonyflake.NewSonyflake(settings) return } // GenID 返回生成的id值 func GenID() (id uint64, err error) { if sonyFlake == nil { err = fmt.Errorf("snoy flake not inited") return } id, err = sonyFlake.NextID() return }