gin框架中使用jwt
生成解析token
如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一。JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本身份验证)具有固有的优势。要了解更多信息,请直接进入jwt.io上的介绍,然后再直接学习。
以下是JWT的实际应用示例。主要有两个部分:提供用户名和密码以获取令牌;并根据请求检查该令牌。
在此示例中,我们使用了两个库,即Go中的JWT实现以及将其用作中间件的方式。
最后,在使用此代码之前,您需要将APP_KEY常量更改为机密(理想情况下,该常量将存储在代码库外部),并改进用户名/密码检查中的内容,TokenHandler以检查不仅仅是myusername/ mypassword组合。
依赖库:
go get -u github.com/golang-jwt/jwt
生成和解析jwt封装代码:
package tool
import (
"fmt"
"github.com/golang-jwt/jwt"
"time"
)
// 定义签名秘钥
var jwtKey = []byte("www.topgoer.com")
type Claims struct {
UserId uint
jwt.StandardClaims
}
// 颁发token
func GenerateToken(userId uint, expireTime time.Time) (tokenStr string) {
claims := Claims{
UserId: userId,
StandardClaims: jwt.StandardClaims{
ExpiresAt: expireTime.Unix(), // 过期时间
IssuedAt: time.Now().Unix(), // 签名时间
Issuer: "127.0.0.1", // 签名颁发者
Subject: "user token", // 签名主题
},
}
token := jwt.NewWithClaims(
jwt.SigningMethodHS256,
claims,
)
tokenStr, err := token.SignedString(jwtKey)
if err != nil {
fmt.Println(err)
}
return
}
// 解析token
func ParseToken(tokenStr string) (*jwt.Token, *Claims, error) {
claims := &Claims{}
token, err := jwt.ParseWithClaims(tokenStr, claims, func(token *jwt.Token) (i interface{}, err error) {
return jwtKey, nil
})
return token, claims, err
}
gin中中间件实现JWT鉴权
// 中间件实现JWT鉴权
func JWTMiddleware() gin.HandlerFunc {
return func(context *gin.Context) {
tokenStr := context.GetHeader("Authorization")
if tokenString == "" {
ctx.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "权限不足"})
ctx.Abort()
return
}
token, claims, err := tool.ParseToken(tokenStr)
if err != nil || !token.Valid {
fmt.Println(err)
context.String(401, "权限不足")
context.Abort()
return
}
context.Set("claims", claims)
}
}
请求处理中设置和获取JWT
// 将生成的tokeng设置到token中了
func setJWT(context *gin.Context) {
expireTime := time.Now().Add(60 * time.Second)
tokenStr := tool.GenerateToken(111, expireTime)
context.SetCookie("Authorization", tokenStr, 60, "/", "127.0.0.1", false, true)
context.String(200, "JWT设置成功")
}
// 解析token在中间件中实现了,中间件从header中去读取Authorization获取token,如果成功,中间件会将解析的claims数据放到context上下文中,处理请求中从上下文拿到数据做事情
func getJWT(context *gin.Context) {
claims, _ := context.Get("claims")
context.JSON(200, claims)
}
当然中间件也可以从cookie中获取token,代码如下
// 中间件实现JWT鉴权
func JWTMiddleware() gin.HandlerFunc {
return func(context *gin.Context) {
tokenStr, _ := context.Cookie("Authorization")
token, claims, err := tool.ParseToken(tokenStr)
if err != nil || !token.Valid {
fmt.Println(err)
context.String(401, "权限不足")
context.Abort()
return
}
context.Set("claims", claims)
}
}
gin框架中使用jwt的更多相关文章
- 在gin框架中使用JWT
在gin框架中使用JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. 什么 ...
- golang gin框架中实现一个简单的不是特别精确的秒级限流器
起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是 ...
- gin框架中请求路由组的使用
1. gin框架中可以使用路由组来实现对路由的分类 package main import "github.com/gin-gonic/gin" func main() { rou ...
- gin框架中的路由
基本路由 gin框架中采用的路由库是基于httrouter做的 地址为:https://github.com/julienschmidt/httprouter httprouter路由库 点击查看代码 ...
- 【解决了一个小问题】gin框架中出现如下错误:"[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 500"
POST到数据到一条gin框架的接口后,客户端收到400错误,并且返回了业务中返回的"decode json fail". 关键代码是: func report(c *gin.Co ...
- golang gin框架中实现大文件的流式上传
一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式 ...
- gin框架中中间件的编写与使用
概念 一个完整的系统可能包括鉴权认证.权限管理.安全检查.日志记录等多维度的系统支持. 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加 ...
- gin框架中的参数验证
结构体验证 用gin框架的数据验证,可以不用解析数据,减少if else,会简洁许多. 处理请求方法 func structValidator(context *gin.Context) { var ...
- gin框架中请求参数的绑定与多数据格式处理
package main import ( "fmt" "github.com/gin-gonic/gin" ) // gin框架提供给开发者表单实体绑定的功能 ...
随机推荐
- 【LeetCode】121. Best Time to Buy and Sell Stock 解题报告(Java & Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 C++ 解法 日期 ...
- 【LeetCode】45. Jump Game II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcod ...
- LeetCode1238循环码排列
题目 给你两个整数 n 和 start.你的任务是返回任意 (0,1,2,,...,2n-1) 的排列 p,并且满足: p[0] = start p[i] 和 p[i+1] 的二进制表示形式只有一位不 ...
- Redis 实现了自己的 VM
Redis的VM(虚拟内存)机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据). Redis提高数据库容量的办法有两种: 1.一种是可以 ...
- Boosting Adversarial Training with Hypersphere Embedding
目录 概 主要内容 代码 Pang T., Yang X., Dong Y., Xu K., Su H., Zhu J. Boosting Adversarial Training with Hype ...
- Cython编译动态库、引用C/C++文件
将某些.py 编译成动态库 设置好要编译的module们: compile_to_c_modules = [ 'package.module' ] 将它们转换成cythonize可识别的参数: def ...
- [git]初始化项目文件到git分支
将本地和远程仓库关联并push本地项目 1.VCS -> import into Version Control -> Create Git Repository 选择项目文件 2 ...
- IM2605说明书| InmicroIM2605|IM2605芯片
IM2605描述 IM2605集成了一个同步4开关Buck-Boost变换器,在输入电压小于或大于输出电压时保持输出电压调节.当输入电压足够大于输出电压时,它作为Buck变换器工作,并随着输入电压接近 ...
- Java初学者作业——定义管理员类(Admin),管理员类中的属性包括:姓名、账号、密码、电话;方法包括:登录、显示自己的信息。
返回本章节 返回作业目录 需求说明: 定义管理员类(Admin),管理员类中的属性包括:姓名.账号.密码.电话:方法包括:登录.显示自己的信息. 实现思路: 分析类的属性及其变量类型. 分析类的方法及 ...
- 编写Java程序,使用抽象类和抽象方法构建不同动物的扑食行为,抽象类设计
返回本章节 返回作业目录 需求说明: 不同的动物都有进食的行为,但是在进食前需要捕获到食物后才可以进食. 要求定义一个抽象的动物类,该类中有一个抽象的捕食方法,和一个非抽象的进食方法.在进食方法中调用 ...