// Copyright 2020 github.com. All rights reserved. // Use of this source code is governed by github.com. package utils import ( "fmt" "google.golang.org/grpc/status" "strconv" "xingjia-management-gateway/errors" "github.com/tidwall/gjson" "git.getensh.com/common/gopkgs/jwtwrapper" "git.getensh.com/common/gopkgs/logger" "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" "go.uber.org/zap" ) type TokenInfo struct { Uid int64 User string UserType int64 EffectiveStart int64 EffectiveEnd int64 } // GetJwtIdFromCtx 从 gin 上下文中获取 id func GetJwtTokenFromCtx(ctx *gin.Context) (TokenInfo, error) { // 从上下文获取信息 value, ok := ctx.Get("claims") ret := TokenInfo{} if !ok { logger.Error("func", zap.String("call", "ctx.Get"), zap.String("error", "no claims data")) return ret, errors.ParamsError } // 解析数据 claims, ok := value.(*jwt.StandardClaims) if !ok { logger.Error("func", zap.String("call", "Claims assert"), zap.String("error", "NOT Claims type")) return ret, errors.ParamsError } // 类型转换 ret.Uid, _ = strconv.ParseInt(claims.Id, 10, 64) ret.User = gjson.GetBytes(StrToBytes(claims.Subject), "user_name").String() ret.UserType = gjson.GetBytes(StrToBytes(claims.Subject), "user_type").Int() ret.EffectiveStart = gjson.GetBytes(StrToBytes(claims.Subject), "effective_start").Int() ret.EffectiveEnd = gjson.GetBytes(StrToBytes(claims.Subject), "effective_end").Int() return ret, nil } func GetSubjectValue(ctx *gin.Context) (bool, int64, error) { value, ok := ctx.Get("claims") if !ok { logger.Error("func", zap.String("call", "ctx.Get"), zap.String("error", "no claims data")) return false, 0, errors.ParamsError } // 解析数据 claims, ok := value.(*jwt.StandardClaims) if !ok { logger.Error("func", zap.String("call", "Claims assert"), zap.String("error", "NOT Claims type")) return false, 0, errors.ParamsError } projectUser := gjson.GetBytes(StrToBytes(claims.Subject), "project_user").Bool() projectId := gjson.GetBytes(StrToBytes(claims.Subject), "project_id").Int() fmt.Printf("projectid:%v\n", projectId) return projectUser, projectId, nil } // GetJwtIdFromCtx 从 gin 上下文中获取 id func GetJwtProjectIdFromCtx(ctx *gin.Context) (int64, error) { // 从上下文获取信息 value, ok := ctx.Get("claims") if !ok { logger.Error("func", zap.String("call", "ctx.Get"), zap.String("error", "no claims data")) return 0, errors.ParamsError } // 解析数据 claims, ok := value.(*jwt.StandardClaims) if !ok { logger.Error("func", zap.String("call", "Claims assert"), zap.String("error", "NOT Claims type")) return 0, errors.ParamsError } // 类型转换 id := gjson.GetBytes(StrToBytes(claims.Subject), "project_id").Int() return id, nil } func TmpTokenVeriy(token string) (int64, error) { // 解析token claims, err := jwtwrapper.ParseToken(token) if err != nil { switch err.(*jwt.ValidationError).Errors { case jwt.ValidationErrorExpired: return 0, status.Error(10010, "登录token错误") default: return 0, status.Error(10010, "登录token错误") } return 0, status.Error(10010, "登录token错误") } isTmp := gjson.GetBytes([]byte(claims.Subject), "tmp_token").Bool() if !isTmp { return 0, status.Error(10010, "登录token错误") } projectId, _ := strconv.ParseInt(claims.Id, 10, 64) return projectId, nil } func EmailTokenVeriy(token string) (uid int64, projectId int64, name string, email string, err error) { // 解析token claims, err := jwtwrapper.ParseToken(token) if err != nil { switch err.(*jwt.ValidationError).Errors { case jwt.ValidationErrorExpired: return 0, 0, "", "", status.Error(10010, "凭据过期") default: return 0, 0, "", "", status.Error(10010, "凭据错误") } return 0, 0, "", "", status.Error(10010, "凭据错误") } name = gjson.GetBytes([]byte(claims.Subject), "user_name").String() email = gjson.GetBytes([]byte(claims.Subject), "email").String() if email == "" { return 0, 0, "", "", status.Error(10010, "邮箱为空") } uid, _ = strconv.ParseInt(claims.Id, 10, 64) projectId = gjson.GetBytes([]byte(claims.Subject), "project_id").Int() return uid, projectId, name, email, nil }