go/gin使用jwt

1、安装拓展包

$ go get -u github.com/dgrijalva/jwt-go

2、发放token

func ReleaseToken(user *model.User) (tokenString string,err error) {
	expire := time.Now().Add(7 * 24 * time.Hour)
	claims := &Claims{
		UserId: user.ID,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: expire.Unix(),
			IssuedAt: time.Now().Unix(),
			Issuer: "oceanlearn.tech",
			Subject: "user token",
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	tokenString, err = token.SignedString(jwtKey)
	if err != nil {
		return "", err
	}
	return

}

3、解析token

func ParseToken(tokenString string) (*jwt.Token, *Claims, error) {
	claims := &Claims{}
	token,err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
		return jwtKey, nil
	})
	return token, claims, err
}

附:

var jwtKey = []byte("apple")

type Claims struct {
	UserId int
	jwt.StandardClaims
}

==============================手动分隔线====================

整个流程

1、用户输入账号密码发送到登录接口,若账号密码正确,则发放token,将此token返回给用户

2、用户后续每次请求,如访问个人信息接口,需要在请求头部加上此token

3、接口收到请求后,会判断token是否有效,若有效则解析token,找到用户id,从而获取用户信息

1、用户登录成功,发放token

token, err := common.ReleaseToken(user)
response.LoginSuccessfully(c, gin.H{"token":token})

2、用户请求头携带token

Authorization Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjE2LCJleHAiOjE2MTEwNDEwNDIsImlhdCI6MTYxMDQzNjI0MiwiaXNzIjoib2NlYW5sZWFybi50ZWNoIiwic3ViIjoidXNlciB0b2tlbiJ9.DRdyspxB7iSUxrawN6QpMR_-SeW7U_FV4E0fMf7BjQI

3、中间件判断token是否有效,获取信息,将用户信息注入到 gin.Context 中

func CheckJWTLogin() gin.HandlerFunc  {
	return func(c *gin.Context) {
		tokenString := c.GetHeader("Authorization")
		if tokenString == "" || !strings.HasPrefix(tokenString, "Bearer "){
			c.JSON(419, gin.H{"code":419, "msg":"unauthorized"})
			c.Abort()
			return
		}

		tokenString = tokenString[7:]
		_, claims, err := common.ParseToken(tokenString)
		if err != nil {
			c.JSON(419, gin.H{"code":419, "msg": err.Error()})
			c.Abort()
			return
		}

		userId := claims.UserId
		var user model.User
		dao.DB.First(&user, userId)
		c.Set("user", user)
		c.Next()
	}
}

猜你喜欢

转载自blog.csdn.net/sinat_37390744/article/details/112531893