package utils import ( "errors" "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" ) const ( AdminAccountKey = "AdminAccount" AccountTypeKey = "AccountType" ) //CreateToken 生成Token算法 func CreateToken(secret string, tokenClaims map[string]interface{}) (tokeness string, err error) { if secret == "" { return "", errors.New("secret is empty") } claims := jwt.MapClaims(tokenClaims) token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) tokeness, err = token.SignedString([]byte(secret)) if err != nil { return "", err } return tokeness, nil } func keyFunc(secret string) jwt.Keyfunc { return func(token *jwt.Token) (interface{}, error) { return []byte(secret), nil } } //ParseToken 解析Token func ParseToken(secret string, tokeness string) (map[string]interface{}, error) { if secret == "" || tokeness == "" { return nil, errors.New("secret or tokeness is empty") } token, err := jwt.Parse(tokeness, keyFunc(secret)) if err != nil { return nil, err } //验证token,如果token被修改过则为false if !token.Valid { return nil, errors.New("token is invalid") } claimsToken, ok := token.Claims.(jwt.MapClaims) if !ok { return nil, errors.New("cannot convert claim to MapClaim") } return claimsToken, nil } // GetAdmin 获取管理员账号 // oauth.Auth执行后有效 func GetAdmin(ctx *gin.Context) (account string, err error) { val, exists := ctx.Get(AdminAccountKey) if !exists { err = errors.New("admin account not exist") return } account, ok := val.(string) if !ok { return "", errors.New("admin account type error") } return } // GetAccountType 获取账号类型 // oauth.Auth执行后有效 func GetAccountType(ctx *gin.Context) (string, error) { var err error val, exists := ctx.Get(AccountTypeKey) if !exists { err = errors.New("claims not exist") return "", err } accType, ok := val.(string) if !ok { return "", errors.New("claims type error") } return accType, nil }