【REST2SQL】11 基于jwt-go生成token与验证

【REST2SQL】01RDB关系型数据库REST初设计
【REST2SQL】02 GO连接Oracle数据库
【REST2SQL】03 GO读取JSON文件
【REST2SQL】04 REST2SQL第一版Oracle版实现
【REST2SQL】05 GO 操作 达梦 数据库
【REST2SQL】06 GO 跨包接口重构代码
【REST2SQL】07 GO 操作 Mysql 数据库
【REST2SQL】08 日志重构增加输出到文件log.txt
【REST2SQL】09 给Go的可执行文件exe加图标和版本信息等
【REST2SQL】10 REST2SQL操作指南

0 token 与 jwt 简介

0.1 token简介

Token 本质是字符串,用于请求时附带在请求头中,校验请求是否合法及判断用户身份。
Token 请求时提供,用于校验用户是否具备访问接口的权限。
Token 的用途主要有三点:

  • 拦截无效请求,降低服务器处理压力;
  • 实现第三方 API授权,无需每次都输入用户名密码鉴权;
  • 身份校验,防止 CSRF 攻击。

0.2 jwt简介

JWT(JSON Web Token)是一种用于身份验证和授权的开放标准(RFC 7519),它是一种安全的、轻量级的身份验证方式。

JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

头部(Header):JWT 的头部通常由两部分信息组成:令牌的类型(即JWT)和所使用的签名算法,例如:

{  "alg": "HS256",  "typ": "JWT"}

载荷(Payload):JWT的载荷包含了一些声明(Claim),用于描述用户信息、权限、过期时间等等,例如:

{  "sub": "1234567890",  "name": "John Doe",  "iat": 1516239022}

签名(Signature):JWT的签名由头部和载荷组成,并使用密钥进行加密生成,例如:

HMACSHA256(  base64UrlEncode(header) + "." +  base64UrlEncode(payload),  secret)

0.2.1 JWT 的使用流程如下:

用户使用用户名和密码进行登录,服务器验证用户信息是否正确。
服务器生成一个JWT,将用户信息、权限等信息写入载荷中,并使用密钥对头部和载荷进行签名。
服务器将生成的JWT返回给客户端,客户端将其存储在本地,通常是在浏览器的cookie或本地存储中。
客户端在后续的请求中,将JWT作为请求头部或请求参数传递给服务器。
服务器收到请求后,验证JWT的签名是否正确,如果正确则解析出用户信息、权限等信息,进行后续操作。

0.2.2 JWT 的优点:

无状态:JWT是无状态的,服务器不需要保存任何会话信息,可以轻松扩展和分布式环境下使用。
安全:JWT通过密钥对头部和载荷进行签名,保证了数据的完整性和安全性。
跨域支持:JWT可以跨域使用,可以在不同的域名和服务器之间使用。
简单易用:JWT使用简单,易于实现和维护。

0.2.3 JWT 的缺点:

载荷信息不能太多:JWT的载荷信息不能太多,否则会导致JWT的长度过长,增加网络传输的负担。
安全性依赖于密钥:JWT的安全性依赖于密钥的保护,如果密钥泄露,则JWT的安全性将受到威胁。
无法撤销:一旦JWT生成后,无法撤销,除非修改密钥或者设置短期的过期时间

1 基于jwt-go实现token服务端

JWT-Go是一个使用Go语言实现的JSON Web Token(JWT)库1。

JWT是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。JWT-Go库提供了创建和验证JWT的方法,包括使用默认Claims和自定义Claims来创建Token对象,以及解析和验证Token的有效性等。JWT-Go库在Go语言社区中广泛使用,并且有许多配置选项可供选择,可以满足不同的业务需求。

1.1 安装jwt-go库

go get github.com/dgrijalva/jwt-go

1.2 创建mytoken项目

全部代码如下:

package mainimport ("encoding/json""fmt""log""net/http""time"jwt "github.com/dgrijalva/jwt-go"
)// 定义Token的Claims
type CustomClaims struct {Userid string `json:"userid"`Passwd string `json:"passwd"`jwt.StandardClaims
}// 定义Token相关变量
var (Uid string = "BLMa"  //用户名Pwd string = "5217"  //密码Key string = "token" //密钥Iss string = "guwuy" //签发者
)// 生成新的Token
func generateToken(userid string) (string, error) {// 设置Claimsclaims := CustomClaims{Userid: userid,Passwd: Pwd,StandardClaims: jwt.StandardClaims{ExpiresAt: time.Now().Add(time.Second* 5217).Unix(), // 设置过期时间Issuer:    Iss,                                    // 设置签发者},}// 创建Tokentoken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)// 签名Token,这里使用硬编码的密钥,实际生产环境中应使用更安全的密钥管理方式signedToken, err := token.SignedString([]byte(Key))if err != nil {return "", err}return signedToken, nil
}// 验证Token
func validateToken(tokenString string) (*CustomClaims, error) {// 解析Tokentoken, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {// 验证Token的签名,这里使用硬编码的密钥return []byte(Key), nil})if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {return claims, nil}return nil, err
}// HTTP处理函数:生成Token
func generateTokenHandler(w http.ResponseWriter, r *http.Request) {//请求参数,实际情况下,这里可能从请求参数或身份验证过程中获取query := r.URL.Query()Uid = query.Get("userid")Pwd = query.Get("passwd")// 这里加uid,pwd的数据库校验token, err := generateToken(Uid)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(map[string]string{"token": token,})
}// HTTP处理函数:验证Token
func validateTokenHandler(w http.ResponseWriter, r *http.Request) {tokenString := r.Header.Get("Authorization") // 假设Token在Authorization头中claims, err := validateToken(tokenString)if err != nil {http.Error(w, err.Error(), http.StatusUnauthorized)return}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(map[string]interface{}{"userid":  claims.Userid,"expires": claims.ExpiresAt,})
}// main入口
func main() {http.HandleFunc("/generate-token", generateTokenHandler)// Http://localhost:8080/generate-token?usetid=blma&passwd=5217// curl Http://localhost:8080/generate-token?usetid=blma%26passwd=5217http.HandleFunc("/validate-token", validateTokenHandler)// curl http://localhost:8080/validate-token -H "Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyaWQiOiI5OTk4IiwicGFzc3dkIjoiODk5OSIsImV4cCI6MTcwOTcyMDU0MSwiaXNzIjoiZ3V3dXkifQ.UXiW-cgnDZfGUmLtv_yme6gzFZ9XDiKaNATIdFzJ2fY"fmt.Println("Starting server ...")fmt.Println("Http://localhost:8080/generate-token?usetid=&passwd=")log.Fatal(http.ListenAndServe(":8080", nil))
}

2 实操演练

2.1 启动服务

在这里插入图片描述

2.2 获取token

打开浏览器地址栏输入:

 http://localhost:8080/generate-token?userid=9998&passwd=8999

在这里插入图片描述

返回token

{"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyaWQiOiI5OTk4IiwicGFzc3dkIjoiODk5OSIsImV4cCI6MTcwOTcyMDU0MSwiaXNzIjoiZ3V3dXkifQ.UXiW-cgnDZfGUmLtv_yme6gzFZ9XDiKaNATIdFzJ2fY"
}

2.3 验证token

cmd窗口输入curl如下命令:

curl http://localhost:8080/validate-token -H "Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyaWQiOiI5OTk4IiwicGFzc3dkIjoiODk5OSIsImV4cCI6MTcwOTcyMDU0MSwiaXNzIjoiZ3V3dXkifQ.UXiW-cgnDZfGUmLtv_yme6gzFZ9XDiKaNATIdFzJ2fY"

在这里插入图片描述

返回token的失效时间和用户id:

{"expires":1709720541,"userid":"9998"}

其中时间戳 1709720541 对应的时间为:2024-03-06 18:22:21


本文完。

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

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

相关文章

紧握时代契机链接亿万家庭 创维汽车2024全球经销商大会圆满召开

3月6日,以“极致 见新境”创维汽车2024全球经销商大会在徐州隆重举行。徐州经开区管委会副主任季洪志,缅甸驻华大使馆商务参赞 Win Myat Aung,法国中小企业联盟主席 Xavier Michon-Lehnebach,创维集团、创维汽车创始人黄宏生&…

php常见的45个漏洞及解决方案

[TOC](太多了,目录只列出最重要的几个,剩下的同学们自己翻) PHP作为一种广泛应用的服务器端脚本语言,在历史上曾曝出过多种安全漏洞。以下是一些PHP漏洞的类别及其简要解释,以及如何解决这些问题&#xff1…

Java精品项目--第5期基于SpringBoot的高速收费系统的设计分析与实现

项目使用技术栈 SpringBootMavenShiroMySQLMybatis-PlusJavaJDK1.8HTML 系统介绍 项目截图

dolphinscheduler试用(一)(边用边修bug。。。。create tenant error)

(作者:陈玓玏) 前提:部署好了dolphinscheduler,部署篇见https://blog.csdn.net/weixin_39750084/article/details/136306890?spm1001.2014.3001.5501 官方文档见:https://dolphinscheduler.apache.org/…

JavaEE进阶(13)案例综合练习——博客系统

接上次博客:JavaEE进阶(12)Spring事务和事务传播机制:事务回顾、Spring中事务的实现、Transactional详解(用法、rollbackFor、事务隔离级别、事务传播机制)-CSDN博客 目录 项目介绍 准备工作 数据准备 …

如何给Vue项目配置好一个nginx.conf文件?

如何给Vue项目配置好一个nginx.conf文件? 一般前端项目中,会有一个docker/nginx/nginx.conf文件,用于配置DockerFile配置等。 那么,如何给项目写好一个nginx.conf文件,以DockerFile为例: # 使用 Node.js …

《辐射4》是一款什么样的游戏 怎样在mac电脑上玩到《辐射4》辐射4攻略 辐射4开局加点 怎么在Mac电脑玩Steam游戏

辐射4(Fallout 4)是由Bethesda开发的一款动作角色扮演类游戏,为《辐射》系列游戏作品的第四代,于2015年11月10日发行。游戏叙述了主角一家在核爆当天(2077年10月23日),被Vault-Tec(避…

Spring Cloud Gateway核心之Predicate

路由 Predicate 工厂 Spring Cloud Gateway 将路由作为 Spring WebFluxHandlerMapping基础设施的一部分进行匹配。Spring Cloud Gateway 包含许多内置的路由Predicate 工厂。所有这些谓词都匹配 HTTP 请求的不同属性。多个 Route Predicate Factory 可以组合,并通过…

Android Studio中debug功能详解

本文为大家分享了Android Studio debug功能的具体使用方法,供大家参考,具体内容如下 运行debug模式 \1. 进入debug – 点击图中红色圆圈圈起的左边绿色按钮,运行app的debug模式,快捷键ShiftF9 – 点击图中红色圆圈圈起的右边按…

[数据结构初阶】栈

各位读者老爷好,鼠鼠我好久没写博客了(太摆烂了),今天就基于C语言浅介绍一下数据结构里面的栈,希望对你有所帮助吧。 目录 1.栈的概念及结构 2.栈的实现 2.1定义栈 2.2.初始化栈 2.3.入栈 2.4.出栈 2.5.获取栈…

zabbix监控中间件服务

zabbix监控Nginx 自定义nginx访问量的监控项,首先要通过脚本将各种状态的值取出来,然后通过zabbix监控。找到自定义脚本上传到指定目录/etc/zabbix/script/ 在zbx-client客户端主机操作 #创建目录,然后将脚本上传到该目录mkdir /etc/zabbix/…

【JS】关于this的使用

this 前言一、this是什么?二、做什么?1.全局环境2.函数环境3.new实例对象4.apply、bind、call绑定4.1 apply()4.2 call()4.3 bind() 三、为什么用this?四、如何改变this?五、应用场景?总结 前言 痛点 经常写Vue项目&a…

C++单例模式、工厂模式

一、单例模式 (一) 什么是单例模式 1. 是什么? 在系统的整个生命周期内,一个类只允许存在一个实例。 2. 为什么? 两个原因: 节省资源。方便控制,在操作公共资源的场景时,避免了多个对象引起的复杂操作…

Unity的相机跟随和第三人称视角二

Unity的相机跟随和第三人称视角二 展示介绍第二种相机模式远离代码总结 展示 我录的视频上可能看不太出来,但是其实今天的这个方法比原来写的那个方法更简便并且死角更少一些。 这里我也做了两个人物偏移的视角,按Q是原来的两个相机模式切换&#xff0c…

论文阅读笔记 | MetaIQA: Deep Meta-learning for No-Reference Image Quality Assessment

文章目录 文章题目发表年限期刊/会议名称论文简要动机主要思想或方法架构实验结果 文章链接:https://doi.org/10.48550/arXiv.2004.05508 文章题目 MetaIQA: Deep Meta-learning for No-Reference Image Quality Assessment 发表年限 2020 期刊/会议名称 Publi…

Marin说PCB之POC电路layout设计仿真案例---01

最近娃哈哈饮料突然爆火,看新闻后才知道春晚的的时候宗老已经病的很严重了,现在也已经离我们而去了,宗老是一个值得我们尊敬爱戴的伟大企业家。于是乎小编我立马去他们的直播间买了一箱娃哈哈AD钙奶支持一下我们的国货。 中午午休的时候&…

Excel如何开启VBA进行二次开发

经常使用Excel做数据分析的朋友平时用的比较多的可能只是一些常用的内置函数或功能,比如求和函数、字符串分割函数、分类汇总、IF函数、VLOOKUP函数等。大多数人认为Excel强大是因为内置了大量的函数。其实,作为一名资深程序猿,个人认为&…

kafka消费端消息去重方案

背景 我们在日常工作中,消费kafka消息是一个最常见的操作,不过由于kafka队列中经常包含重复的消息,并且消息量巨大,所以我们消费端总是需要先把消息进行去重后在消费,以减少消费端的压力,那么日常中我们一…

redis 性能优化一

目录 前言 尾延迟 前言 说到redis 性能优化,优化的目的是什么?提高响应,减少延迟。就要关注两点,一是尾延迟,二是Redis 的基线性能。只有指标,我们的优化,才有意义,才能做监控以及…

玩一会小乌龟

滚滚长江东逝水,浪花淘尽英雄。 是非成败转头空。青山依旧在,几度夕阳红。 白发渔樵江渚上,惯看秋月春风。 一壶浊酒喜相逢。古今多少事,都付笑谈中。 画一个正方形 import turtle# 创建一个Turtle对象 t turtle.Turtle()# 循环…