首页 > 其他分享 >gin框架中JWT的使用

gin框架中JWT的使用

时间:2023-04-14 22:12:43浏览次数:39  
标签:框架 err jwt JWT Token token gin

前言:

Token 和 Session

Session 是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。

而 Token 是令牌,访问资源接口(API)时所需要的资源凭证。Token 使服务端无状态化,不会存储会话信息。

正文:

Gin  JWT

基于JWT的Token认证机制实现

JSON Web Token(JWT)是一个非常轻巧的规范。

这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,

restful api的无状态认证

 

JWT的组成

一个JWT实际上就是一个字符串,它由三部分组成,它们之间用圆点(.)连接

分别是:

Header     声明类型以及加密算法

Payload    存放有效信息的地方  过期时间 ….

Signature  签证信息

 

token示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJOYW1lIjoibGFtcG9sIiwiZXhwIjoxNjQyNDA5ODExLCJpYXQiOjE2NDI0MDk3NTEsInN1YiI6InVzZXIgdG9rZW4ifQ.knArw6dhbVwWMkiMzgQ3JWymFl_HU5c4-nwanO72xE8

 

Header   jwt的头部由两部分信息组成:

type:声明类型,这里是jwt

alg:声明加密的算法 通常直接使用 HMAC SHA256

{

"type":"jwt",

"alg":"HS256"

}

安装JWT

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

 

jwt生成token字符串

 

生成token代码如下:

 

type UserClaims struct {
    jwt.StandardClaims //嵌套
    UserName           string
}

var JWTKEY = []byte("asdfadsfadsf")  //签名的key,任意填写即可
// 获取token
func getToken(c *gin.Context) {
    //payload
    claims := UserClaims{
        UserName: "lampol",
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: time.Now().Add(60 * time.Second).Unix(), //过期时间
            IssuedAt:  time.Now().Unix(),                   //签发时间
            Subject:   "user token",
        },
    }
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, &claims)
    tokenString, err := token.SignedString(JWTKEY)
    if err != nil {

        log.Fatal(err.Error())
    }
    c.JSON(http.StatusOK, gin.H{
        "code":  200,
        "msg":   "get token success",
        "token": tokenString,
    })

}
func main() {
    router := gin.Default()
    //定义路由
    router.GET("getToken", getToken)
    router.Run()
}

 

运行:http://localhost:8080/getToken 得到如下结果

{"code":200,"
msg":"get token success",
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2Nzk3Mzc4OTcsImlhdCI6MTY3OTczNzgzNywic3ViIjoidXNlciB0b2tlbiIsIlVzZXJOYW1lIjoieWFuZ3BocCJ9.c7ZA1SGiZSnocFF5Y7M_kRugqJy3xsIAl3Jjcv9Axgk"}

 

 

 

token过期说明:

jwt的token生成出来后,过期时间未到是不会过期的。如果需要在程序中设置过期,就需要在将token加入数据库或者redis中,将对应token的值设置为过期即可

项目中:

先使用jwt进行token验证

然后再使用数据库或者redis再进行验证一次

全部通过后才可以正常使用

token解析验证

 

type User struct {
    Token string `form:"token" binding:"required"`
}
// 解析token
func ParseToken(c *gin.Context) {
    var u User
    err := c.ShouldBind(&u)
    if err != nil {
        c.String(http.StatusOK, err.Error())
        return
    }
    claims := UserClaims{}
    token, err := jwt.ParseWithClaims(u.Token, &claims, func(t *jwt.Token) (interface{}, error) {
        return JWTKEY, nil
    })
    //解析错误
    if err != nil{
        c.JSON(http.StatusOK, gin.H{"code": 404, "msg": "token invalid"})
    return
    }
    //验证失败
    if token.Valid != true {

        ve, _ := err.(*jwt.ValidationError)
        if ve.Errors == jwt.ValidationErrorExpired {
            c.JSON(http.StatusOK, gin.H{"code": 404, "msg": "token expired"})
        } else {
            c.JSON(http.StatusOK, gin.H{"code": 405, "msg": "token invalid"})
        }
        return
    }
    //验证成功,
    c.JSON(http.StatusOK, gin.H{
        "code" : 200,
        "msg" : "token valid success",
        "token": token,
    })
    return
}

func main() {
    router := gin.Default()
    //定义路由
    router.GET("getToken", getToken)
    router.GET("ParseToken", ParseToken)
    router.Run()
}

 

完结

 

标签:框架,err,jwt,JWT,Token,token,gin
From: https://www.cnblogs.com/ypeih/p/17320092.html

相关文章

  • 基于SSM框架的航班购票系统
    @文章目录目录1、相关技术1.1、Javaweb1.2、SSM框架1.3、前端框架AngularJS1.4、数据库MySQL1.5、数据库Redis1.6、开发工具Eclipse2、需求分析2.1、系统实现目标2.2、系统功能分析2.3、系统用例图3、工程结构及其说明4、系统总体设计4.1、软件架构设计4.2、总体功能模块设计4.3......
  • Linux离线安装nginx详细教程
    本文安装环境centos7.9一、什么是离线安装?使用离线安装包进行软件安装的方式就叫离线安装。离线安装包又叫做完整安装包,包含所有的安装文件。与其相对的是在线安装,即在条件允许且网络良好的条件下采用网络安装的方式。在线安装方式的缺点是在不太好的网络状况下容易出现长时......
  • nginx、PHP安装配置
    1、安装nginxsudoapt-getinstallnginx2、配置nginxsudovim/etc/nginx/sites-available/defaultserver{ listen80; #443是https的端口,如果你用的是http就用‘80’代替‘443ssl’ #server_namewebofhu.......
  • repository does not exist or may require 'docker login'
    理论上从docker hub拉取镜像时是不需要的登录,所以就只有一个原因: repositorydoesnotexist仓库类型将私有改成公开 ......
  • Plugin 'maven-surefire-plugin:2.12.4' not found(已解决)
    今天按照视频教程配置maven插件(maven-surefire-plugin)时,老师说这是maven内部的插件,可以不用写<groupId></groupId>标签,然后就报红:Plugin'maven-surefire-plugin:2.12.4'notfound也就是说这个插件找不到,于是添加<groupId>org.apache.maven.plugins</groupId>,刷新maven即可解决,......
  • VUE框架中实现HTML页面(局部)内容转PDF下载
    有一朋友想把网页内容变成PDF下载下来。问我有没有好办法。这还真巧了,咱公司也有这个需求,就是网页生成合同,然后可以直接打印合同内容。最早吧,就是可以直接打印就好了。当时为解决完美打印的问题,挺费劲的,当时第三方插件还有BUG(当然把解决放给发给作者了,作者早已经修复了),正经反复......
  • nginx集群和nginx主备不是同一个概念
    Nginx 集群搭建 https://huaweicloud.csdn.net/63560e7dd3efff3090b591dc.html?spm=1001.2101.3001.6650.14&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~activity-14-117463438-blog-127292749.235^v28^pc_relevant_default&dept......
  • docker nginx
    1,#创建挂载目录mkdir-p/home/nginx/confmkdir-p/home/nginx/logmkdir-p/home/nginx/html 2,#生成容器dockerrun--namenginx-p9001:80-dnginx#将容器nginx.conf文件复制到宿主机dockercpnginx:/etc/nginx/nginx.conf/home/nginx/conf/nginx.conf#将容器c......
  • 学习K8S 使用Operator部署管理Nginx
    创建一个KubernetesOperator部署nginx的大致过程如下:确定您要使用的OperatorSDK版本并安装它。使用OperatorSDK命令行创建新的Operator项目。定义CustomResourceDefinition(CRD),即将在Kubernetes中定义的自定义资源规范,以及该资源的状态和操作。例如,定义一个名为......
  • 自己项目用到的Nginx环境部署手册
    nginxsticky基于cookie的负载均衡googler开发的google-perftools优化Nginx管理,性能将会有一定程度的提升[/size]([/size][size=10.5pt;font-family:'Calibri',sans-serif;"lang="EN-US]64位[/size]操作系统请先安装libunwind库,32位操作系统不要安装。libunwind库为基于64......