go使用gin结合jwt做登录功能

news2024/10/7 20:27:15

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、结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

共享汽车管理系统nodejs+vue

语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 前端nodejsvueelementui, 共享汽车管理系统的系统管理员可以管理用户,可以对用户信息修改删除以及查询操作。具体界面的展…

JQ-3 jQuery事件处理(click和on的区别、事件冒泡、事件对象、事件委托、小案例); jQuery动画(常见动画函数、动画队列、小案例)

目录 1_ jQuery事件处理1.1_认识事件(Event)1.2_click和on的区别1.3_ jQuery的事件冒泡1.4_jQuery的事件对象( Event Object)1.5_ jQuery的事件委托(event delegation)1.6_ jQuery常见的事件1.7_小案例 2_ jQuery 动画2.1_介绍2.2…

【力扣每日一题】2023.7.23 接雨水

目录 题目: 示例: 分析: 代码运行结果: 题目: 示例: 分析: 接雨水是力扣里非常经典的一道单调栈的题目,使用单调栈的做法就是从左到右将高度依次入栈,保持栈内从栈顶…

《零基础入门学习Python》第060讲:论一只爬虫的自我修养8:正则表达式4

有了前面几节课的准备,我们这一次终于可以真刀真枪的干一场大的了,但是呢,在进行实战之前,我们还要讲讲正则表达式的实用方法和扩展语法,然后再来实战,大家多把持一会啊。 我们先来翻一下文档:…

【iOS安全】iOS 14.3越狱教程

iOS 14.3越狱教程 通过MacBook越狱iPhone 8 方案:AltStore unc0ver 实验环境 手机:iPhone 8 OS版本:iOS 14.3 型号号码:A1863 PC型号:MacBook 实验步骤 Mac安装AltServer https://altstore.io/ 解压后启动 …

【ES】---ES的聚合(aggregations)

目录 一、前言1、聚合分类2、聚合的实现方式二、RestAPI--bucket聚合案例11、按照类型分bucket2、按照(String)时间分bucket三、RestAPI-- metric聚合案例11、metric指标统计四、RestAPI-- pipeline聚合案例1一、前言 聚合是对文档数据的统计、分析、计算。 注意:参与聚合的字…

Clion开发STM32之W5500系列(NTP服务封装)

概述 在w5500基础库中进行封装,获取服务端的时间,来校准本地时间。本次使用的方案是通过ntp获取时间定时器更新保证时间准确。 NTP封装 头文件 /*******************************************************************************Copyright (c) [sc…

【动态规划part03】| 343.整数拆分、96.不同的二叉搜索树

目录 🎈LeetCode343.整数拆分 🎈 LeetCode96.不同的二叉搜索树 🎈LeetCode343.整数拆分 链接:343.整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些…

S32K1xx SDK(版本:S32_SDK_S32K1xx_RTM_4.0.3 )详细介绍

前言 在学习一款MCU之前,一般我的习惯是先下载官方提供的SDK包进行学习。然后学习了解SDK提供的资源、框架、以及各目录结构文件作用等,下面边学边做笔记记录。 S32K1系列SDK我们可以到下面的NXP官网去获取: https://www.nxp.com.cn/design…

数据库备份还原-mysqldump、mydumper、xtrabackup、压缩

数据库备份,数据库为school,素材如下 一、创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARC…

Windows bat 查找文件被哪个进程占用,并终止该进程

一、背景 我有个批处理脚本如下: echo off chcp 936 & cls cd /D F:\Chen\python3\ExciseC set fdate%date:~0,4%%date:~5,2%%date:~8,2% python main.py >> crawl_record_%fdate%.log 2>&1 for /F %%f in (dir crawl_record_*.log /B ^| find /…

关于Swift中闭包和OC中block对局部变量基本数据类型值的捕获

翻了很多文章,发现关于Swift闭包关于上下文变量捕获这块,都没有说的很详细,或者Swift2这样的老版本已经不适用了,问了GPT也是和自己实验的结果不一样,记录下来。 一:OC的block 首先,回顾一下O…

varnish入门

b站视频 官网 docker安装varnish 某位博客园的varnish系列 varnish04-varnish如何使用VCL 3varnish的原理 varnish是什么 varnish的安装 VCL基础 Varnish Configuration Language (VCL)是一种特定于领域的语言,可以用于描述Varnish Cache服务如何处理请求和缓存…

ONE-PEACE论文解读

文章目录 1. 摘要2. 引言3. 算法3.1 结构模态自适应器3.2 模态融合编码器3.3 任务 4. 实验4.1 视觉任务4.2 音频任务4.3 视觉语言任务4.4 消融实验4.5 zero-shot检索 5. 结论 论文: 《ONE-PEACE: EXPLORING ONE GENERAL REPRESENTATION MODEL TOWARD UNLIMITED MOD…

Mysql最左匹配原则和索引下堆

前言: 最左匹配的基础是联合索引 联合索引 联合索引也称为符合索引,适用于多条件查询。 简单说,它是按多个列建立起来的索引,此外联合索引也是有顺序的。 如下图,以A列和B列建立复合索引,某一层节点&…

学习路之PHP--计算2个坐标点之间距离、时间比较

一、计算2个坐标点之间距离 /** * 根据起点坐标和终点坐标测距离 * param [array] $from [起点坐标(经纬度),例如:array(118.012951,36.810024)] * param [array] $to [终点坐标(经纬度)] * param [bool] $km 是否以公里为单位 false:米 true:公里(千米) …

matlab pcnormals()函数的功能 详解

官方解释: pcnormals - Estimate normals for point cloud This MATLAB function returns a matrix that stores a normal for each point in the input ptCloud. normals pcnormals(ptCloud) normals pcnormals(ptCloud,k) 输入参数 ptClo…

捷米特PROFINET总线协议网关介绍

关于PROFINET PROFINET由PROFIBUS国际组织(PROFIBUS International,PI)推出,是新一代基于工业以太网技术的自动化总线标准。 PROFINET为自动化通信领域提供了一个完整的网络解决方案,囊括了诸如实时以太网、运动控制…

详解 Linux 常用命令

目录 简单介绍 Linux 左侧信息栏 命令 ls ll cd pwd ctrl l touch cat man echo vim vimtutor mkdir rm cp mv grep ps 面试题: 简单介绍 当我们说"Linux"时,通常指的是一种开源的计算机操作系统。Linux 是一个基于 UNIX 操作系…

24.实现线性拟合和相关系数(matlab程序)

1.简述 1. 基本语法 1.1 corr函数基本语法 语法 说明 rho corr(X) 返回输入矩阵X中每对列之间的两两线性相关系数矩阵。 rho corr(X, Y) 返回输入矩阵X和Y中每对列之间的两两相关系数矩阵。 [rho, pval] corr(X, Y) 返回pval,一个p值矩阵&#xff0c…