gin使用jwt登录验证

使用github.com/dgrijalva/jwt-go包,gihub地址:https://github.com/dgrijalva/jwt-go
安装包

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

简单封装生成token、验证token有效、通过Authorization解析token三个函数
models/jwt.go

package modelsimport ("net/http""strings""time""github.com/dgrijalva/jwt-go""github.com/gin-gonic/gin"
)// 定义一个结构体,这个结构体需要继承 jwt.StandardClaims 结构体
type MyClaims struct {Uid      int    // 用户idUserName string // 用户名jwt.StandardClaims
}// 定义key
var jwtKey = []byte("a_secret_test123456")// 过期时间24小时
var expireTime = time.Now().Add(24 * time.Hour).Unix()// 生成token
func GenerateToken(c *gin.Context, uid int, username string) (string, error) {// 创建MyClaims实例myClaims := MyClaims{uid,      // 用户idusername, // 用户名jwt.StandardClaims{ExpiresAt: expireTime,Issuer:    "test",},}// 创建签名对象tokenObj := jwt.NewWithClaims(jwt.SigningMethodHS256, myClaims)// 使用指定的jwtKey签名获取完整编码字符串tokentokenStr, err := tokenObj.SignedString(jwtKey)if err != nil {c.JSON(http.StatusOK, gin.H{"message": "生成token失败","success": false,})return "", err}// 返回tokenreturn tokenStr, nil// c.JSON(http.StatusOK, gin.H{// 	"message": "获取token成功",// 	"token":   tokenStr,// 	"success": true,// })
}// 获取Authorization的值
func GetAuthorizationToken(c *gin.Context) string {// 获取接口传递过来的AuthorizationtokenInfo := c.Request.Header.Get("Authorization")var tokenStr = ""if len(tokenInfo) > 0 {// 截取tokentokenStr = strings.Split(tokenInfo, " ")[1]}// 返回tokenreturn tokenStr
}// 验证token是否有效
func ParseToken(tokenStr string) (*jwt.Token, *MyClaims, error) {myClaims := &MyClaims{}token, err := jwt.ParseWithClaims(tokenStr, myClaims, func(token *jwt.Token) (i interface{}, err error) {return jwtKey, nil})return token, myClaims, err
}

登录简单逻辑测试
controller/api.go

package apiimport ("fmt""gin-jwt-demo/models""net/http""github.com/gin-gonic/gin"
)type V1ApiController struct{}// 登录
func (v V1ApiController) Login(c *gin.Context) {uid := 1234567username := "zhangsan"// 这块省略账号密码登录逻辑...// 走到这说明登录成功,生成tokentokenStr, err := models.GenerateToken(c, uid, username)if err != nil {c.JSON(http.StatusOK, gin.H{"message": "登录失败","token":   tokenStr,"success": false,})return}// 将token、uid、username存到cookie中c.SetCookie("token", tokenStr, 3600, "/", "localhost", false, false)c.SetCookie("uid", fmt.Sprintf("%d", uid), 3600, "/", "localhost", false, false)c.SetCookie("username", username, 3600, "/", "localhost", false, false)c.JSON(http.StatusOK, gin.H{"message":  "登录成功","token":    tokenStr,"uid":      uid,"username": username,"success":  true,})
}// 获取用户信息接口 需要身份授权验证
func (v V1ApiController) UserInfo(c *gin.Context) {// 从header获取Authorizationauthorization := models.GetAuthorizationToken(c)// 不存在token 校验token是否有效tokenObj, userInfos, err := models.ParseToken(authorization)// 校验authorization是否为空if authorization == "" || err != nil {c.JSON(http.StatusOK, gin.H{"message": "未登录","success": false,})return}c.JSON(http.StatusOK, gin.H{"message":  "成功获取用户信息","uid":      userInfos.Uid,"username": userInfos.UserName,"token":    tokenObj.Raw,"success":  true,})
}

router/router.go

package routerimport ("gin-jwt-demo/controller/api""github.com/gin-gonic/gin"
)func ApiRouterInit(r *gin.Engine) {// v1接口apiV1Routers := r.Group("/api/v1"){// 登录接口apiV1Routers.GET("/login", api.V1ApiController{}.Login)// 获取用户信息接口apiV1Routers.GET("/userinfo", api.V1ApiController{}.UserInfo)}

main.go

package mainimport ("gin-jwt-demo/models""github.com/gin-gonic/gin"
)func main() {// 路由初始化r := gin.Default()// 解决cors跨域//配置gin允许跨域请求r.Use(models.Cors())// api路由注册ApiRouterInit(r)// 服务启动r.Run(":9999")
}

vue项目发送axios请求携带Authorization

js

import Cookies from "js-cookie";
import axios from "axios";
axios.defaults.baseURL = "http://localhost:9999";const getUserInfo = () => {// 获取cookieaxios.get("/api/v1/userinfo", {headers: {Authorization: "Bearer " + Cookies.get("token"),},}).then((res) => {console.log("获取用户信息:", res);});
};

template

<template><div id="app"><Button @click="getUserInfo">获取用户信息</Button></div>
</template>

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

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

相关文章

HCIA-Datacom题库(自己整理分类的)_08_FTP协议【8道题】

一、单选 1.在使用FTP协议升级路由器软件时&#xff0c;传输模式应该选用___ 二进制模式 字节模式 文字模式 流字节模式 解析&#xff1a;二进制模式&#xff1a;在数据连接中传输&#xff0c;不对数据进行任何处理&#xff0c;不需要转换或格式化就可以传输字符。 2.以…

网页设计与制作web前端设计html+css+js成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站(HTML静态网页项目实战)附源码】

网页设计与制作web前端设计htmlcssjs成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站&#xff08;HTML静态网页项目实战&#xff09;附源码】 https://www.bilibili.com/video/BV1Hp4y1o7RY/?share_sourcecopy_web&vd_sourced43766e8ddfffd1f1a1165a3e72d7605

【C++】STL 算法 ⑥ ( 二元谓词 | std::sort 算法简介 | 为 std::sort 算法设置 二元谓词 排序规则 )

文章目录 一、二元谓词1、二元谓词简介2、 std::sort 算法简介3、 代码示例 - 为 std::sort 算法设置 二元谓词 排序规则 一、二元谓词 1、二元谓词简介 " 谓词 ( Predicate ) " 是一个 返回 布尔 bool 类型值 的 函数对象 / 仿函数 或 Lambda 表达式 / 普通函数 , …

逆置算法和数组循环移动算法

元素逆置 概述&#xff1a;其实就是将 第一个元素和最后一个元素交换&#xff0c;第二个元素和倒数第二个元素交换&#xff0c;依次到中间位置。用途&#xff1a;可用于数组的移动&#xff0c;字符串反转&#xff0c;链表反转操作&#xff0c;栈和队列反转等操作。 逆置图解 …

2024年1月7日15:09:50

2024年1月7日15:09:55复习&#xff1a;我今天学了有价值的东西&#xff0c;那就是在瓦罗兰特拿到了三杀 2024年1月7日15:11:10学习了如何使用vivopad2的键盘 可以稍微用一下 2024年1月7日15:17:58 学习一个编程的题目 2024年1月7日15:31:27不用机械键盘打字效率就是比不用低…

深入理解堆(Heap):一个强大的数据结构

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 前言堆的实现基本操作结构体定义初始化堆&#xff08;HeapInit&#xff09;销毁堆&#xff08;HeapDestroy&#xff09; 重要函数交换函数&#xff08;…

Talk | EMNLP 2023 最佳长论文:以标签为锚-从信息流动的视角分析上下文学习

本期为TechBeat人工智能社区第561期线上Talk。 北京时间1月4日(周四)20:00&#xff0c;北京大学博士生—王乐安的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “以标签为锚-从信息流动的视角分析上下文学习”&#xff0c;介绍了他的团队在上下文学…

STM32深入系列02——BootLoader分析与实现

文章目录 1. STM32程序升级方法1.1 ST-Link / J-link下载1.2 ISP&#xff08;In System Programing&#xff09;1.3 IAP&#xff08;In Applicating Programing&#xff09;1.3.1 正常程序运行流程1.3.2 有IAP时程序运行流程 2. STM32 Bootloader实现2.1 方式一&#xff1a;Boo…

Qt/QML编程学习之心得:Linux下Thread线程创建(26)

GUI设计中经常为了不将界面卡死,会用到线程Thread,而作为GUI设计工具,Qt也提供了一个这样的类,即QThread。 QThread对象管理程序中的一个控制线程。线程QThread开始在run()中执行。默认情况下,run()通过调用exec()启动事件循环,并在线程内运行Qt事件循环。 也可以通过…

Java泛型中的T,R,K,V,E:一探究竟

Java的泛型&#xff0c;作为一种强大的编程工具&#xff0c;让代码更具复用性&#xff0c;同时避免了类型转换的繁琐操作。在使用泛型时&#xff0c;我们经常会遇到一些特定的类型参数符号&#xff0c;如T、R、K、V、E等。那么这些符号代表的是什么呢&#xff1f;下面&#xff…

【第6期】使用Iview的Select组件进行远程搜索并在编辑时设置一个或多个默认值

本期简介 下拉框这个组件用的地方非常多&#xff0c;普通用法就是将数据列表一次性查询渲染&#xff0c;在列表里面直接本地搜索&#xff0c;优点是可缓存、速度快&#xff0c;但在某些场合并不适用&#xff0c;比如要在下拉框中选择一所中国的学校&#xff0c;幼儿园/小学/初…

20240107查看Android11下移远的4G模块EC20在Firefly的AIO-3399J开发板跑通时的相关服务

20240107查看Android11下移远的4G模块EC20在Firefly的AIO-3399J开发板跑通时的相关服务 2024/1/7 11:24 缘起&#xff1a;友善之臂的SDK&#xff1a;rk3399-android-11-r20211216.tar.xz可以跑通EC20&#xff0c;但是Toybrick的不行&#xff01; 同样是Andrid11&#xff0c;因此…

【前端】下载文件方法

1.window.open 我最初使用的方法就是这个&#xff0c;只要提供了文件的服务器地址&#xff0c;使用window.open也就是在新窗口打开&#xff0c;这时浏览器会自动执行下载。 2.a标签 其实window.open和a标签是一样的&#xff0c;只是a标签是要用户点击触发&#xff0c;而wind…

Python的核心知识点整理大全66(已完结撒花)

目录 D.3 忽略文件 .gitignore 注意 D.4 初始化仓库 D.5 检查状态 D.6 将文件加入到仓库中 D.7 执行提交 D.8 查看提交历史 D.9 第二次提交 hello_world.py D.10 撤销修改 hello_world.py 注意 D.11 检出以前的提交 往期快速传送门&#x1f446;&#xff08;在文…

外贸独立站建站详细操作流程一览,跨境电商卖家营销必看!

独立站是一个独立的网站&#xff0c;包括有独立的服务器&#xff0c;独立的网站程序以及网站域名。关于独立站的优势已经说了很多&#xff0c;本文就不再细谈&#xff0c;想了解的小伙伴可以自行查找之前发布的文章观看。 今天就来说说搭建独立站的详细步骤都有哪些&#xff1f…

FlinkRestAPI

which flink 找到Flink客户端地址 如果输出结果为空&#xff0c;则说明 Flink 客户端没有安装在系统路径中。在这种情况下&#xff0c;您可以通过设置 FLINK_HOME 环境变量来指定 Flink 客户端的路径。例如&#xff1a; export FLINK_HOME/opt/flink 然后&#xff0c;您可以使…

Docker mysql 主从复制

目录 介绍&#xff1a;为什么需要进行mysql的主从复制 主从复制原理&#xff1a; ✨主从环境搭建 主从一般面试问题&#xff1a; 介绍&#xff1a;为什么需要进行mysql的主从复制 在实际的生产中&#xff0c;为了解决Mysql的单点故障已经提高MySQL的整体服务性能&#xff…

【AI视野·今日NLP 自然语言处理论文速览 第七十期】Thu, 4 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 4 Jan 2024 Totally 29 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Multilingual Instruction Tuning With Just a Pinch of Multilinguality Authors Uri Shaham, Jonathan Herzi…

英飞凌TC3xx之一起认识GTM(十一)详细说说GTM子模块TIM(TIM通道模式)

英飞凌TC3xx之一起认识GTM(十一)详细说说GTM子模块TIM(TIM通道模式) 1 PWM 测量模式TPWM2 脉冲积分模式TPIM3 输入事件模式TIEM4 输入预分频器模式TIPM5 位压缩模式TBCM6 门控定期采样模式TGPS7 串行移位模式TSSM8 常见应用举例8.1 如何配置TPIM模式8.2 如何配置TIEM模式8.…

Python3 列表--20240104

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。 Python 有 6 个序列的内置类型,但最常见的是列表和元组。 列表都可以进行的操作包括索引,切片,加,乘,检查成员。 此外,Pyth…