一起使用GO(golang) 来做一个后台管理系统系列(3) 编写鉴权控制 jwt包

编写此包目的,主要是为了验证token,校验用户登陆数据,还可进行权限访问等等:

创建jwt.go。 本演示包位于middleware下

直接上代码,不多说:

package jwt

import (
	"github.com/gin-gonic/gin"
	"myProject/pkg/e"
	"myProject/pkg/util"
	"net/http"
	"strings"
	"time"
)

/**
  每一个请求前验证Token
*/
func JWT() gin.HandlerFunc {
	return func(c *gin.Context) {
		var code int
		var data interface{}

		code = e.SUCCESS
		token := c.Query("token")

		//获取header的token-===========================

		authString := c.Request.Header.Get("Authorization")
		kv := strings.Split(authString, " ")
		if len(kv) != 2 || kv[0] != "Bearer" {
			code = e.ERROR_AUTH_CHECK_TOKEN_FAIL
			return
		} else {
			token = kv[1]
		}

		//================================================

		if token == "" {
			code = e.INVALID_PARAMS
		} else {
			claims, err := util.ParseToken(token)
			if err != nil {
				code = e.ERROR_AUTH_CHECK_TOKEN_FAIL
			} else if time.Now().Unix() > claims.ExpiresAt {
				code = e.ERROR_AUTH_CHECK_TOKEN_TIMEOUT
			}
			//上边的超时条件
			if err != nil {
				var timeout int
				timeout = strings.Index(err.Error(), "token is expired")
				if timeout != -1 {
					code = e.ERROR_AUTH_CHECK_TOKEN_TIMEOUT
				}
			}
		}

		if code != e.SUCCESS {
			c.JSON(http.StatusUnauthorized, gin.H{
				"code": code,
				"msg":  e.GetMsg(code),
				"data": data,
			})

			c.Abort()
			return
		}

		c.Next()
	}
}

创建 auth.go

package api

import (
	"github.com/astaxie/beego/validation"
	"github.com/gin-gonic/gin"
	"log"
	"myProject/models"
	"myProject/pkg/e"
	"myProject/pkg/util"
	"net/http"
)

/*
 获得一个Token
*/
func GetAuth(c *gin.Context) {
	username := c.Query("username")
	password := c.Query("password")

	valid := validation.Validation{}
	a := models.Auth{Username: username, Password: password}
	ok, _ := valid.Valid(&a)

	data := make(map[string]interface{})
	code := e.INVALID_PARAMS
	if ok {
		isExist := true //corll.GetUserByNameAndPassword(username, password) //models.CheckAuth(username, password)
		if isExist {
			token, err := util.GenerateToken(username, password)
			if err != nil {
				code = e.ERROR_AUTH_TOKEN
			} else {
				data["token"] = token

				code = e.SUCCESS
			}

		} else {
			code = e.ERROR_AUTH
		}
	} else {
		for _, err := range valid.Errors {
			log.Println(err.Key, err.Message)
		}
	}

	c.JSON(http.StatusOK, gin.H{
		"code": code,
		"msg":  e.GetMsg(code),
		"data": data,
	})
}

代码说明:

1. jwt代码部分主要是 对用户提交的token做了 校验

2. auth 代码部分主要是对token生成的。

 

你可能感兴趣的:(GO,实战web)