首页 > 其他分享 >gin框架中jwt实战之用户登录返回token

gin框架中jwt实战之用户登录返回token

时间:2023-04-14 22:35:33浏览次数:35  
标签:http jwt token user go gin

流程:

1、main.go 中定义路由login 调用 user.Login方法

2、user.login方法验证用户名,和密码,并生成token返回

3、main.go中定义getUserInfo路由,调用 user.GetUserInfo的方法

4、getUserinfo中调用中间件对用户传过来的token进行验证

5、验证通过后返回用户信息

文件:

main.go 路由定义

controller/user/user.go 定义用户登录和获取用户信息的方法

common/jwt/jwt.go 定义生成token的方法

middleware/jwt/auth.go 定义token验证的中间件

 

6、调用:

(1)http://127.0.0.1:8080/login  输入 用户名,密码 进行登录

(2)http://127.0.0.1:8080/getUserinfo 输入token返回用户信息

代码如下:

 

main.go

 

import (
    "github.com/gin-gonic/gin"
    "learn/controller/user"
    MiddlewareJwt "learn/middleware/jwt"
)

func main() {
    router := gin.Default()
    //定义路由
    router.POST("login", user.Login)
    //使用中间件
    router.Use(MiddlewareJwt.JwtAuth)
    {
        router.POST("getUserInfo", user.GetUserInfo)
    }
    router.Run()
}

 

 

controller/user/user.go

import (
    "github.com/gin-gonic/gin"
    Jwt "learn/common/jwt"
    "net/http"
)

// 定义结构体,接收表单提交的数据
type User struct {
    Name     string `form:"name" binding:"required"`
    Password string `form:"password" binding:"required"`
}

func Login(c *gin.Context) {
    var u User
    err := c.ShouldBind(&u)
    if err != nil {
        c.JSON(http.StatusOK, gin.H{"code": 500, "msg": err.Error()})
        return
    }
    if u.Password != "123456" || u.Name != "lampol" {
        c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "用户名或密码错误"})
        return
    }
    //登录成功,获取token返回给前端
    token := Jwt.GetToken(u.Name)
    c.JSON(http.StatusOK, gin.H{
        "code":  400,
        "msg":   "login success",
        "token": token,
    })
    return
}

func GetUserInfo(c *gin.Context) {

    claims, _ := c.Get("cliaims")
    //判断token
    c.JSON(http.StatusOK, gin.H{
        "code":   400,
        "msg":    "GetUserInfo Success",
        "claims": claims,
    })
}

common/jwt/jwt.go

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

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

var JWTKEY = []byte("lampol123456")

// 获取token
func GetToken(name string) string {
    //payload
    claims := UserClaims{
        UserName: name,
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: time.Now().Add(120 * 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())
    }
    return tokenString
}

middleware/jwt/auth.go

import (
    "github.com/dgrijalva/jwt-go"
    "github.com/gin-gonic/gin"
    Jwt "learn/common/jwt"
    "net/http"
)

// 验证 token
func JwtAuth(c *gin.Context) {
    token := c.Request.Header.Get("token")
    if token == "" {
        c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "no token"})
        c.Abort() //终止
        return
    }

    claims := Jwt.UserClaims{}
    _, err := jwt.ParseWithClaims(token, &claims, func(t *jwt.Token) (interface{}, error) {
        return Jwt.JWTKEY, nil
    })
    //验证失败
    if err != nil {
        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"})
        }
        c.Abort() //终止
        return
    }

    c.Set("cliaims", claims) //传递参数
}

 

完结

 

标签:http,jwt,token,user,go,gin
From: https://www.cnblogs.com/ypeih/p/17320141.html

相关文章

  • gin框架中JWT的使用
    前言:Token和SessionSession是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。而Token是令牌,访问资源接口(API)时所需要的资源凭证。Token使服务端无状态化,不会存储会话信息。正文:Gin JWT基于JWT的Token认证机制实现JSONWebToken(JWT)是一个......
  • Yunzai-BotQQ账号登录报错:token失效: [禁止登录]你当前使用的QQ版本过低,请前往QQ官网i
    token失效:[禁止登录]你当前使用的QQ版本过低解决方案写在前面:该问题是TX认为账号有被用作BOT的嫌疑,而阻止你登陆。但是由于是我们人类在登陆,用来卡BOT的验证码测试肯定可以通过,TX就用“版本过低”的问题来卡我们!!TX我***网上尝试了许多方法,包括对device.json大改特改,还说什么......
  • 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即可解决,......
  • 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......