40--go语言学习之JWT使用

  1.  依赖

    go get github.com/dgrijalva/jwt-go
  2.  代码

    package main
    
    import (
    	"fmt"
    	"net/http"
    	"strconv"
    	"time"
    
    	"github.com/dgrijalva/jwt-go"
    	"github.com/gin-gonic/gin"
    )
    
    type User struct {
    	Id       int    `json:"id"`
    	Name     string `json:"name"`
    	Phone    string `json:"phone"`
    	Password string `json:"password"`
    }
    
    // 定义StandardClaims
    type MyClaims struct {
    	UserId int
    	jwt.StandardClaims
    }
    
    var secret = []byte("secret_aabbcc") // 密钥  密钥如果泄露  用户就可以伪造token
    
    func main() {
    	engine := gin.Default()
    	engine.POST("create", createHandler)
    	engine.GET("check", checkHandler)
    	engine.Run(":9003")
    }
    
    func checkHandler(c *gin.Context) {
    	// 获取页面jwt和用户id
    	tokenStr := c.Query("jwt")
    	userId := c.Query("id")
    	id, _ := strconv.Atoi(userId) // 将用户id转int类型
    	fmt.Println("token验证.....", userId, tokenStr)
    	if len(tokenStr) == 0 || id == 0 {
    		c.JSON(http.StatusInternalServerError, "jwt/userId为空")
    		return
    	}
    	token, claims, err := checkJwt(tokenStr)
    	if err != nil || !token.Valid {
    		c.JSON(http.StatusInternalServerError, "token无效或已过期")
    		return
    	}
    	// 判断用户id解析的是否一样
    	if !(id == claims.UserId) {
    		c.JSON(http.StatusInternalServerError, "用户不存在")
    		return
    	}
    	c.JSON(http.StatusOK, "验证成功")
    }
    
    func createHandler(c *gin.Context) {
    	var user User
    	c.Bind(&user)
    	fmt.Println("登陆....", user)
    	if user.Id == 0 || user.Phone == "" || user.Password == "" {
    		c.JSON(http.StatusInternalServerError, "id/phone/password为空")
    		return
    	}
    	// 判断手机号和验证码是否正确
    	if user.Phone == "13111111111" && user.Password == "1234" {
    		token, err := createJwt(user.Id)
    		if err != nil {
    			c.JSON(http.StatusInternalServerError, "生成token失败")
    			return
    		}
    		c.JSON(http.StatusOK, token)
    		return
    	}
    	c.JSON(http.StatusInternalServerError, "登陆失败")
    	return
    }
    
    // 检查token
    func checkJwt(tokenStr string) (*jwt.Token, *MyClaims, error) {
    	claims := &MyClaims{}
    	token, err := jwt.ParseWithClaims(tokenStr, claims, func(token *jwt.Token) (i interface{}, e error) {
    		return secret, nil
    	})
    	return token, claims, err
    }
    
    // 创建token
    func createJwt(userId int) (string, error) {
    	// 1、设置token参数
    	expiresTime := time.Now().Add(7 * 24 * time.Hour) // 设置token过期时间为7天后
    	claims := &MyClaims{
    		UserId: userId,
    		StandardClaims: jwt.StandardClaims{
    			ExpiresAt: expiresTime.Unix(), // 过期时间
    			IssuedAt:  time.Now().Unix(),  // 生成时间
    			Subject:   "loginJwt",         // 主题
    			Issuer:    "wxb",              // 发布者
    		},
    	}
    	// 2、创建token对象
    	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    	// 3、根据密钥生成token字符串
    	tokenStr, err := token.SignedString(secret)
    	if err != nil {
    		fmt.Println("生成失败", tokenStr)
    		return "", err
    	}
    	return tokenStr, nil
    }
    
  3. 测试 
     生成jwt

     验证jwt
     
     
  •  RSA方式 

     

     
  •  ECDSA方式 

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值