golang web服務器開發使用JsonWebToken(JWT)身份驗證

jwt的介紹我就不再寫了,之前的文章有介紹過Asp.Net WebApi 使用JsonWebToken(JWT)身份驗證,這篇文章主要簡單說一下在golang的使用。

主要文件

package utils

import (
	"github.com/dgrijalva/jwt-go" //引入的jwt包
	"time"
)

//自定義Claims,繼承包內的Claims
type jwtCustomClaims struct {
	jwt.StandardClaims        

	// 追加自己需要的信息
	Uuid     string `json:"uuid"`
	Nickname string `json:"nickname"`
}

//生成token
func CreateJWT(SecretKey []byte, Uuid string, Nickname string) (tokenString string, err error) {
    //生成Clamis
	claims := &jwtCustomClaims{
		jwt.StandardClaims{
			ExpiresAt: int64(time.Now().Add(time.Hour * 1).Unix()),//有效期
		},
		Uuid,    //用戶uuid
		Nickname,    //用戶名
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	tokenString, err = token.SignedString(SecretKey)    //簽名(加密)
	return
}

//解析token
func ParseJWT(tokenSrt string, SecretKey []byte) (claims jwt.Claims, err error) {
	var token *jwt.Token
	token, err = jwt.Parse(tokenSrt, func(*jwt.Token) (interface{}, error) {
		return SecretKey, nil
	})
	claims = token.Claims
	return
}

 

使用方法:

package http

import (
	"net/http"
	"strings"

	sql "github.com/LyonNee/grom_echo_demo/data"
	"github.com/LyonNee/grom_echo_demo/model"
	"github.com/LyonNee/grom_echo_demo/utils"
	"github.com/labstack/echo"
	"github.com/labstack/echo/middleware"
)

func Start() {
	e := echo.New()

	e.Use(middleware.Logger())

	var mjwt = middleware.JWTWithConfig(middleware.JWTConfig{
		SigningKey: []byte("secret"),
	})

	e.POST("/register", register)
	e.POST("/login", login)
	e.POST("/my", my, mjwt)

	e.Logger.Fatal(e.Start(":8080"))
}

func register(c echo.Context) error {
	user := new(model.User)
	if err := c.Bind(user); err != nil {
		return err
	}

	err := sql.AddUser(*user)
	if err != nil {
		return c.String(http.StatusOK, "用戶已存在")
	} else {
		return c.String(http.StatusOK, "組冊成功")
	}
}

func login(c echo.Context) error {
	loginIM := new(model.LoginIM)
	if err := c.Bind(loginIM); err != nil {
		return err
	}

	var user = model.User{}
	user, err := sql.GetUserByUsername(loginIM.Username)

	if err != nil {
		return c.String(http.StatusOK, "用戶不存在")
	} else if utils.GetMD5HashCode(loginIM.Password) != user.Password {
		return c.String(http.StatusOK, "密碼錯誤")
	}

	// Generate encoded token and send it as response.
	t, err := utils.CreateJWT([]byte("secret"), user.UUID, user.Nickname)
	if err != nil {
		return c.String(http.StatusOK, err.Error())
	}
	return c.JSON(http.StatusOK, map[string]string{
		"token": t,
	})
}

func my(c echo.Context) error {
	tokenStr := c.Request().Header.Get("Authorization")
	if strings.Contains(tokenStr, "Bearer ") {
		tokenStr = tokenStr[7:]
	}

	claims, err := utils.ParseJWT(tokenStr)
	name := claims.Nickname
	//uuid:=claims.Uuid
	if err != nil {
		return c.JSON(http.StatusOK, map[string]string{
			"name": name,
		})
	}
	return c.String(http.StatusOK, "Welcome "+name+" !")
}

 

Demo源碼鏈接

基本上就是這樣了,有問題或者是有建議的歡迎留言評論或者私信我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章