Go-jwt

简介: Go-jwt

Go-jwt

简介

jwt 和 token 类似,在服务端加入一个 secret 密钥,又用户发送用户名密码给服务端,服务端验证,验证成功后就生成三个部分 header,payload,signature 组成的 jwt token 给客户端,之后的请求都带上 jwt token,服务端通过 secret 密钥进行验证。

缺点:无法中途废弃

安装

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

使用步骤

1、生成解析token

import (
    "errors"
    "github.com/dgrijalva/jwt-go"
    "time"
)

// 自定义 secret
var jwtSecret = []byte("testtest")

//Claim是一些实体(通常指的用户)的状态和额外的元数据
type Claims struct {
   
    Username string `json:"username"`
    Password string `json:"password"`
    jwt.StandardClaims
}

// 根据用户的用户名和密码产生token
func GenerateToken(username, password string) (string, error) {
   
    //设置token有效时间
    nowTime := time.Now()
    expireTime := nowTime.Add(3 * time.Hour)

    claims := Claims{
   
        Username: username,
        Password: password,
        StandardClaims: jwt.StandardClaims{
   
            // 过期时间
            ExpiresAt: expireTime.Unix(),
            // 指定token发行人
            Issuer: "gin-blog",
        },
    }

    tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    //该方法内部生成签名字符串,再用于获取完整、已签名的token
    token, err := tokenClaims.SignedString(jwtSecret)
    return token, err
}

// 根据传入的token值获取到Claims对象信息,(进而获取其中的用户名和密码)
func ParseToken(token string) (*Claims, error) {
   

    //用于解析鉴权的声明,方法内部主要是具体的解码和校验的过程,最终返回*Token
    tokenClaims, err := jwt.ParseWithClaims(token, &Claims{
   }, func(token *jwt.Token) (interface{
   }, error) {
   
        return jwtSecret, nil
    })
    if err != nil {
   
        return nil, err
    }
    if tokenClaims != nil {
   
        // 从tokenClaims中获取到Claims对象,并使用断言,将该对象转换为我们自己定义的Claims
        // 要传入指针,项目中结构体都是用指针传递,节省空间。
        if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {
   
            return claims, nil
        }
    }
    return nil, errors.New("invalid token")
}

2、jwt 中间件

import (
    "devops/pkg/jwtOperation"
    "github.com/gin-gonic/gin"
    "net/http"
    "strings"
)

// JWTAuthMiddleware 基于JWT的认证中间件--验证用户是否登录
func JWTAuthMiddleware() func(c *gin.Context) {
   
    return func(c *gin.Context) {
   
        authHeader := c.Request.Header.Get("authorization")
        if authHeader == "" {
   
            c.JSON(http.StatusUnauthorized, gin.H{
   
                "code": 2003,
                "msg":  "请求头中auth为空",
            })
            c.Abort()
            return
        }
        // 按空格分割
        parts := strings.Split(authHeader, ".")
        if len(parts) != 3 {
   
            c.JSON(http.StatusUnauthorized, gin.H{
   
                "code": 2004,
                "msg":  "请求头中auth格式有误",
            })
            c.Abort()
            return
        }
        mc, ok := jwtOperation.ParseToken(authHeader)
        if ok != nil {
   
            c.JSON(http.StatusUnauthorized, gin.H{
   
                "code": 2005,
                "msg":  "无效的Token",
            })
            c.Abort()
            return
        }
        //m := mc.Username
        // 将当前请求的username信息保存到请求的上下文c上
        c.Set("username", mc.Username)
        c.Next() // 后续的处理函数可以用过c.Get("username")来获取当前请求的用户信息
    }
}

3、测试登录

func AuthLoginHandler(c *gin.Context) {
   
    // 用户发送用户名和密码过来
    var user models.DevopsAuthModel
    err := c.ShouldBindJSON(&user)
    if err != nil {
   
        c.JSON(http.StatusBadRequest, gin.H{
   
            "code": 2001,
            "msg":  "无效的参数",
        })
        return
    }
    tokenString, _ := jwtOperation.GenerateToken(user.UserName, user.Password)
    c.JSON(http.StatusOK, gin.H{
   
        "code":     2000,
        "msg":      "success",
        "Token":    tokenString,
        "username": user.UserName,
    })
}

4、路由接入 jwt 中间件

func Routers(e *gin.Engine) {
   
  e.POST("/login", controllers.AuthLoginHandler)
  demo1 := e.Group("/demo1")
    demo1.Use(middleware.JWTAuthMiddleware())
    {
   
        demo1.GET("/get", controllers.GetHandler)
        demo1.POST("/post", controllers.GetHandler)
    }
}
相关文章
|
Cloud Native Linux 网络安全
如何利用Gitlab-CI持续部署到远程机器?
长话短说,今天聊一聊使用Gitlab-CI 自动部署到远程服务器。
如何利用Gitlab-CI持续部署到远程机器?
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
如何利用AI简历优化工具提升招聘效率?HR必读指南
本文为HR提供如何利用AI简历优化工具提升招聘效率的实用指南。针对海量简历筛选难题,AI工具通过自然语言处理技术实现信息提取与智能分析,大幅提高筛选效率和精准度。文章解析了工具在数据驱动决策、多语言支持及动态评估模型上的优势,并提出科学应用框架,如岗位画像量化、分阶段筛选策略等。同时探讨未来智能化招聘趋势,强调人机协同的重要性,助力HR将精力转向更具创造性的工作,推动人力资源管理体系全面升级。
|
10月前
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
278 1
|
Ubuntu 网络协议 数据安全/隐私保护
使用VNC远程桌面Ubuntu【内网穿透实现公网远程】
使用VNC远程桌面Ubuntu【内网穿透实现公网远程】
665 0
|
消息中间件 JSON 中间件
你用Go写过中间件吗?带你用Go实现【操作日志中间件】
管理后台所有修改,添加,删除的操作都要记录;操作日志的统计不影响主程序的性能
710 76
你用Go写过中间件吗?带你用Go实现【操作日志中间件】
|
存储 JSON Java
spring boot3登录开发-1(整合jwt)
spring boot3登录开发-1(整合jwt)
411 1
|
移动开发 网络协议 安全
HTML5页面被运营商DNS问题及解决方案,app中h5页面源码的获取
HTML5页面被运营商DNS问题及解决方案,app中h5页面源码的获取
256 4
|
小程序
微信小程序中引导用户关注公众号实现方案详细说明
之前讲过如何利用公众号针对指定用户完成业务操作之后实时发送消息
微信小程序中引导用户关注公众号实现方案详细说明
|
存储 安全 API
阿里云——云存储:对象存储管理与安全
阿里云——云存储:对象存储管理与安全
840 0
|
JSON Go API
Go --- Zap日志包的使用
Go --- Zap日志包的使用
Go --- Zap日志包的使用