package utils import ( "fmt" "github.com/gin-gonic/gin" "go-micro.dev/v4/auth" "go-micro.dev/v4/metadata" "golang.org/x/net/context" "net/http" "sghgogs.com/micro/auth-client/utils/authutil" "strconv" "strings" "time" ) func ConvertTimeToInt64(t time.Time) int64 { return t.Unix() } func ConvertInt64ToTime(seconds int64) time.Time { return time.Unix(seconds, 0) } func CreateContextWithToken(c *gin.Context, service, endpoint string) (context.Context, string) { token := c.GetHeader("Authorization") userAgent := c.Request.Header.Get("User-Agent") fmt.Println(userAgent) return metadata.NewContext(context.Background(), map[string]string{ "Authorization": token, "Micro-Service": service, "Micro-Endpoint": endpoint, "Agent": userAgent, }), token } func TokenAuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { token := strings.TrimPrefix(c.GetHeader("Authorization"), auth.BearerScheme) if len(token) > 0 { if inspect, err := authutil.JWTAuthService.Inspect(token); err == nil { fmt.Println("TokenAuthMiddleware", inspect.Metadata) if value, ok := inspect.Metadata["expiry"]; ok { expiry, _ := strconv.ParseInt(value, 10, 64) fmt.Println("expiry", expiry-time.Now().Unix()) if (expiry - time.Now().Unix()) < 60*10 { fmt.Println("需要重新刷新了") refreshToken, err := authutil.JWTAuthService.RefreshToken(token) if err == nil { c.Header("Access-Control-Expose-Headers", "access-token") c.Header("access-token", fmt.Sprintf("%v", refreshToken.AccessToken)) c.Request.Header.Set("Authorization", fmt.Sprintf("%v %v", auth.BearerScheme, refreshToken.AccessToken)) fmt.Println(refreshToken.AccessToken) } } } } } if token == "" { c.JSON(http.StatusUnauthorized, gin.H{ "code": http.StatusUnauthorized, "message": "已失效,请重新登录", }) c.Abort() // 终止请求处理 return } c.Next() } }