go如何使用gin结合jwt做登录功能简单示例

 更新时间:2024年01月17日 08:28:57   作者:wjdsg  
jwt全称Json web token,是一种认证和信息交流的工具,这篇文章主要给大家介绍了关于go如何使用gin结合jwt做登录功能的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

1、安装gin

go get -u github.com/gin-gonic/gin

2、安装session

go get github.com/gin-contrib/sessions

3、安装JWT鉴权

go get "github.com/golang-jwt/jwt/v4"

4、创建一个jwt的工具文件

package utils

import (
	"errors"
	"github.com/golang-jwt/jwt/v4"
	"time"
)

type MyClaims struct {
	Phone                string `json:"phone"`
	jwt.RegisteredClaims        // 注意!这是jwt-go的v4版本新增的,原先是jwt.StandardClaims
}

var MySecret = []byte("wjdsg") // 定义secret,后面会用到

func Secret() jwt.Keyfunc {
	return func(token *jwt.Token) (interface{}, error) {
		return []byte(MySecret), nil // 这是我的secret
	}
}

// 这里传入的是手机号,因为我项目登陆用的是手机号和密码
func MakeToken(phone string) (tokenString string, err error) {
	claim := MyClaims{
		Phone: phone,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(3 * time.Hour * time.Duration(1))), // 过期时间3小时
			IssuedAt:  jwt.NewNumericDate(time.Now()),                                       // 签发时间
			NotBefore: jwt.NewNumericDate(time.Now()),                                       // 生效时间
		}}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim) // 使用HS256算法
	tokenString, err = token.SignedString(MySecret)
	return tokenString, err
}

// 解析jwt
func ParseToken(tokenss string) (*MyClaims, error) {
	token, err := jwt.ParseWithClaims(tokenss, &MyClaims{}, Secret())
	if err != nil {
		if ve, ok := err.(*jwt.ValidationError); ok {
			if ve.Errors&jwt.ValidationErrorMalformed != 0 {
				return nil, errors.New("非法令牌")
			} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
				return nil, errors.New("令牌国企")
			} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
				return nil, errors.New("令牌未激活")
			} else {
				return nil, errors.New("令牌未知错误")
			}
		}
	}
	if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
		return claims, nil
	}
	return nil, errors.New("couldn't handle this token")
}

5、开始使用

package main

import (
	"awesomeProject/utils"
	"fmt"
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	// 初始化gin服务
	rootRouter := gin.Default()

	// 创建cookie存储
	store := cookie.NewStore([]byte("secret"))
	//路由上加入session中间件
	rootRouter.Use(sessions.Sessions("mysession", store))

	//配置路由组
	group := rootRouter.Group("/wjdsg")
	{
		group.GET("/set", func(context *gin.Context) {
			session := sessions.Default(context)

			token, err := utils.MakeToken("15088888888")
			if err != nil {
				fmt.Println("jwt生产错误")
			}
			//将jwt保持到session中
			session.Set("adminId", token)
			session.Save()
			context.JSON(http.StatusOK, token)
		})
		group.GET("/get", func(context *gin.Context) {

			//获取jwt
			session := sessions.Default(context)
			token := session.Get("adminId").(string)
			//解析jwt
			parseToken, err := utils.ParseToken(token)
			if err != nil {
				fmt.Println("jwt解析错误:", err)
			}

			m := make(map[string]interface{})

			m["jwt"] = token
			m["解析"] = parseToken

			context.JSON(http.StatusOK, m)
		})
	}

	//启动http服务,可以修改端口
	address := fmt.Sprintf(":%d", 8080)
	rootRouter.Run(address)
}

6、结果

总结 

到此这篇关于go如何使用gin结合jwt做登录功能的文章就介绍到这了,更多相关go gin结合jwt做登录功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang中使用不定数量空格分割字符串的方法

    Golang中使用不定数量空格分割字符串的方法

    有这样一个使用空格分割字符串的场景,字符串中被分割的子串之间的空格数量不确定,有一个两个或者多个空格,这种场景下,使用最容易想到的strings.Split函数就做不到了,本文接下来就介绍几种行之有效的方法,需要的朋友可以参考下
    2023-07-07
  • goland2020.2.x永久激活码破解详细教程亲测可用(Windows Linux Mac)

    goland2020.2.x永久激活码破解详细教程亲测可用(Windows Linux Mac)

    这篇文章主要介绍了goland2020.2.x永久激活码破解详细教程亲测可用(Windows Linux Mac) ,对goland激活码注册码相关知识感兴趣的朋友跟随小编一起看看吧
    2020-11-11
  • go操作Kafka使用示例详解

    go操作Kafka使用示例详解

    这篇文章主要为大家介绍了go操作Kafka使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • golang sync.Cond同步机制运用及实现

    golang sync.Cond同步机制运用及实现

    在 Go 里有专门为同步通信而生的 channel,所以较少看到 sync.Cond 的使用,不过它也是并发控制手段里的一种,今天我们就来认识下它的相关实现,加深对同步机制的运用
    2023-09-09
  • 深入Go goroutine理解

    深入Go goroutine理解

    这篇文章主要介绍了深入Go goroutine理解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • vscode搭建go开发环境案例详解

    vscode搭建go开发环境案例详解

    对于Visual Studio Code开发工具,有一款优秀的GoLang插件,今天通过本文给大家介绍下vscode搭建go开发环境的详细教程,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • golang 实用库gotable的具体使用

    golang 实用库gotable的具体使用

    使用gotable框架以实现在CLI命令行界面中打印表格。本文就介绍一下golang 实用库gotable的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 从go语言中找&和*区别详解

    从go语言中找&和*区别详解

    这篇文章主要介绍了从go语言中找&和*区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Go疑难杂症讲解之为什么nil不等于nil

    Go疑难杂症讲解之为什么nil不等于nil

    在日常开发中,可能一不小心就会掉进 Go 语言的某些陷阱里,而本文要介绍的 nil ≠ nil 问题,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-10-10
  • go语言中的协程详解

    go语言中的协程详解

    本文详细讲解了go语言中的协程,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论