From cb707715e4648719a5ab083f0623620079b20f2a Mon Sep 17 00:00:00 2001
From: liuxiaolong <736321739@qq.com>
Date: 星期四, 20 六月 2019 16:23:42 +0800
Subject: [PATCH] task rules set complete

---
 middlewares/auth/jwt.go |  107 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 107 insertions(+), 0 deletions(-)

diff --git a/middlewares/auth/jwt.go b/middlewares/auth/jwt.go
index 8832b06..c7074e2 100644
--- a/middlewares/auth/jwt.go
+++ b/middlewares/auth/jwt.go
@@ -1 +1,108 @@
 package auth
+
+import (
+	"encoding/json"
+	"errors"
+	jwtLib "github.com/dgrijalva/jwt-go"
+	"github.com/dgrijalva/jwt-go/request"
+	"github.com/gin-gonic/gin"
+	"net/http"
+	"strings"
+	"time"
+)
+
+type jwtAuthManager struct {
+	secret string
+	expire time.Duration
+	alg string
+}
+
+func NewJwtAuthDriver() *jwtAuthManager{
+	return &jwtAuthManager{
+		secret:TokenKey,
+		expire:time.Hour*8,
+		alg:"HS256",
+	}
+}
+
+func (jwtAuth *jwtAuthManager) Check(c *gin.Context) bool {
+	token := c.Request.Header.Get("Authorization")
+	b := "Bearer "
+	if !strings.Contains(token, b) {
+		return false
+	}
+	t := strings.Split(token, b)
+	if len(t) < 2 {
+		return false
+	}
+	var keyFunc = func(token *jwtLib.Token) (interface{},error) {
+		b := []byte(jwtAuth.secret)
+		return b,nil
+	}
+	authJwtToken, err:= request.ParseFromRequest(c.Request,request.OAuth2Extractor,keyFunc)
+	if err !=nil {
+		return false
+	}
+
+	c.Set("User",map[string]interface{}{
+		"token":authJwtToken,
+	})
+
+	return authJwtToken.Valid
+}
+
+func (jwtAuth *jwtAuthManager) User(c *gin.Context) interface{}{
+	var jwtToken *jwtLib.Token
+	if jwtUser, exist := c.Get("User");!exist{
+		tokenStr :=strings.Replace(c.Request.Header.Get("Authorization"),"Bearer ","",-1)
+		if tokenStr == ""{
+			return map[interface{}]interface{}{}
+		}
+		var err error
+		jwtToken,err = jwtLib.Parse(tokenStr, func(token *jwtLib.Token) (interface{}, error) {
+			b :=[]byte(jwtAuth.secret)
+			return b,nil
+		})
+		if err !=nil {
+			panic(err)
+		}
+	} else {
+		jwtToken = jwtUser.(map[string]interface{})["token"].(*jwtLib.Token)
+	}
+	if claims,ok :=jwtToken.Claims.(jwtLib.MapClaims);ok && jwtToken.Valid{
+		var user map[string]interface{}
+		if err := json.Unmarshal([]byte(claims["user"].(string)), &user); err != nil {
+			panic(err)
+		}
+		c.Set("User", map[string]interface{}{
+			"token": jwtToken,
+			"user":  user,
+		})
+		return user
+	} else {
+		panic(errors.New("decode jwt user claims fail"))
+	}
+}
+
+func (jwtAuth *jwtAuthManager) Login(http *http.Request, w http.ResponseWriter, user map[string]interface{}) interface{} {
+
+	token := jwtLib.New(jwtLib.GetSigningMethod(jwtAuth.alg))
+
+	userStr, err := json.Marshal(user)
+	token.Claims = jwtLib.MapClaims{
+		"user": string(userStr),
+		"exp":  time.Now().Add(jwtAuth.expire).Unix(),
+	}
+
+	tokenString, err := token.SignedString([]byte(jwtAuth.secret))
+	if err != nil {
+		return nil
+	}
+
+	return tokenString
+}
+
+func (jwtAuth *jwtAuthManager) Logout(http *http.Request, w http.ResponseWriter) bool {
+
+	return true
+}

--
Gitblit v1.8.0