// Copyright 2020 github.com. All rights reserved. // Use of this source code is governed by github.com. package utils import ( "google.golang.org/grpc/status" "smart-supplier-management-gateway/errors" "strconv" "github.com/tidwall/gjson" "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" "github.com/jaryhe/gopkgs/logger" "go.uber.org/zap" "github.com/jaryhe/gopkgs/jwtwrapper" ) // GetJwtIdFromCtx 从 gin 上下文中获取 id func GetJwtIdFromCtx(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, _ := strconv.ParseInt(claims.Id, 10, 64) return id, nil } func GetTokenInfo(ctx *gin.Context) (string, 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, _ := strconv.ParseInt(claims.Id, 10, 64) user := gjson.GetBytes(StrToBytes(claims.Subject), "user_name").String() return user, id, 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 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 }