一緒にGO(golang)を使ってバックグラウンド管理システムシリーズを作ります.(3)認証制御jwtバッグを作成します.

2769 ワード

このパッケージを作成する目的は、主に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に対して生成されます.