前言

golang-jwt是go语言中用来生成和解析jwt的一个第三方库,早先版本也叫jwt-go。本文中使用目前最新的v5版本。

安装

go get -u github.com/golang-jwt/jwt/v5

在代码中引用

import "github.com/golang-jwt/jwt/v5"

结构体

假设jwt原始的payload如下,username,exp为过期时间,nbf为生效时间,iat为签发时间。第一个是业务非敏感参数,后三者为jwt标准的参数。

{
"username": "zhangsan",
"exp": 1681869394,
"nbf": 1681782994,
"iat": 1681782994
}

对此编写结构体,其中jwt.RegisteredClaims包含了expnbfiat三个字段。

type User struct {
Username string `json:"username"`
jwt.RegisteredClaims // v5版本新加的方法
}

生成jwt

入参为username和密钥,返回jwt的字符串和error。

func GenerateJWT(username, secretKey string) (string, error){
claims := User{
username,
jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), // 过期时间24小时
IssuedAt: jwt.NewNumericDate(time.Now()), // 签发时间
NotBefore: jwt.NewNumericDate(time.Now()), // 生效时间
},
}
// 使用HS256签名算法
t := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
s, err := t.SignedString([]byte(secretKey)) return s, err
}

解析jwt

func ParseJwt(tokenstring, secretKey string) (*User, error) {
t,err := jwt.ParseWithClaims(tokenstring, &User{}, func(token *jwt.Token) (interface{}, error) {
return []byte(secretKey), nil
}) if claims,ok := t.Claims.(*User); ok && t.Valid {
return claims, nil
} else {
return nil,err
}
}

完整示例

package main

import (
"fmt"
"os"
"time" "github.com/golang-jwt/jwt/v5"
) type User struct {
Username string `json:"username"`
jwt.RegisteredClaims // v5版本新加的方法
} // 生成JWT
func GenerateJWT(username, secretKey string) (string, error) {
claims := User{
username,
jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), // 过期时间24小时
IssuedAt: jwt.NewNumericDate(time.Now()), // 签发时间
NotBefore: jwt.NewNumericDate(time.Now()), // 生效时间
},
}
// 使用HS256签名算法
t := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
s, err := t.SignedString([]byte(secretKey)) return s, err
} // 解析JWT
func ParseJwt(tokenstring, secretKey string) (*User, error) {
t,err := jwt.ParseWithClaims(tokenstring, &User{}, func(token *jwt.Token) (interface{}, error) {
return []byte(secretKey), nil
}) if claims,ok := t.Claims.(*User); ok && t.Valid {
return claims, nil
} else {
return nil,err
}
} func main() {
var secretKey string = "qwertyuiop"
s, err := GenerateJWT("zhangsan", secretKey)
if err != nil {
fmt.Println("generate jwt failed, ", err)
os.Exit(1)
}
fmt.Printf("%s\n", s) // 解析jwt
claims, err := ParseJwt(s, secretKey)
if err != nil {
fmt.Println("parse jwt failed, ", err)
os.Exit(1)
}
fmt.Printf("%+v\n", claims)
}

参考

[golang]jwt生成与解析的更多相关文章

  1. 国服最强JWT生成Token做登录校验讲解,看完保证你学会!

    转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...

  2. JWT生成token及过期处理方案

    业务场景 在前后分离场景下,越来越多的项目使用token作为接口的安全机制,APP端或者WEB端(使用VUE.REACTJS等构建)使用token与后端接口交互,以达到安全的目的.本文结合stacko ...

  3. 利用jwt生成token,用于http请求身份验证

    前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行token有效验证. 1.利用jwt生成token a.导入jwt相关包 <!-- jwt --> ...

  4. golang jwt

    什么是JWT? JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. JWT作用? ...

  5. 使用 JWT 生成 token

    JWT 简介 JWT:Json Web Token 官网:https://jwt.io 优点:可生成安全性较高的 token 且可以完成时效性的检验(登陆过期检查) JWT 结构:(由官网获取) JW ...

  6. 常用功能系列---【JWT生成Token实现接口登录认证方案思路】

    JWT生成Token实现接口登录认证方案思路 方案一(双token实现无感刷新) 在token中,refreshToken的作用主要是避免token过期时,前端用户突然退出登录,跳转至登录页面. 但是 ...

  7. [转]java二维码生成与解析代码实现

    转载地址:点击打开链接 二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1.  高密度编码,信息容量大 可容纳多达1850个大 ...

  8. iOS开发之JSON格式数据的生成与解析

    本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...

  9. 在Salesforce中处理Xml的生成与解析

    在Salesforce中处理Xml的生成与解析 1): Generate Xml private String ConvertAccountToXmlInfo(Account acc){ Dom.Do ...

  10. Android zxing实现二维码生成和解析

    二维码的生成与解析.有多种途径.我选择用大品牌,google老大的zxing. gitHub链接是(我用的3.0.0,已经是nio了) https://github.com/zxing/zxing/t ...

随机推荐

  1. ADG无法切换:报错 ORA-16467

    现象: ADG无法切换:验证时就报错 ORA-16467 记录问题,顺便展现一次troubleshooting的心路历程. 具体查询: 在主库操作, @primary 切换验证: alter data ...

  2. 2022-01-30:最小好进制。 对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制。 以字符串的形式给出 n, 以字符串的形式返回 n 的

    2022-01-30:最小好进制. 对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制. 以字符串的形式给出 n, 以字符串的形式 ...

  3. Luogu1772 [ZJOI2006] 物流运输

    传送门 简化题意 给你 \(m\) 个码头,码头之间有双向边连接,\(n\) 天,其中一些码头在某些天会不可用,这 \(n\) 天都要有一条从 \(1\) 到 \(m\) 的路,每一次更换道路会需要 ...

  4. 《数据结构(C语言版)》严蔚敏代码实现———链表

    一.前言 哈喽,大家好~我是熊子q,我又来了! 他来了他来了,他带着代码过来了! 今天要分享的代码是链表!快快搬着小板凳! 二.代码 严奶奶的书中预定义了一些预定义常量和类型,大家可以 新建一个y.h ...

  5. Java的Object类的方法

    Java的Object类是所有类的根类,它提供了一些通用的方法.下面是一些常用的Object类方法: 1. equals(Object obj):判断当前对象是否与给定对象相等.默认情况下,equal ...

  6. 如何在.net6webapi中配置Jwt实现鉴权验证

    JWT(Json Web Token) jwt是一种用于身份验证的开放标准,他可以在网络之间传递信息,jwt由三部分组成:头部,载荷,签名.头部包含了令牌的类型和加密算法,载荷包含了用户的信息,签名则 ...

  7. go 常用命令总结

    转载请注明出处: go build:编译包和依赖项,生成可执行文件.命令用于编译包和依赖项,生成可执行文件.当对Go程序进行修改后,需要使用go build命令重新编译程序,以生成新的可执行文件.该命 ...

  8. Cronjob 定时任务

    Job: 负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束. CronJob: 则就是在Job上加上了时间调度. 我们用Job这个资源对象来创建一个任务,我们定一个Job来 ...

  9. C++面试八股文:std::string是如何实现的?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第18面: 面试官:std::string用过吧? 二师兄:当然用过(废话,C++程序员就没有没用过std::string的). 面试官:std::s ...

  10. 【技术积累】Spring Boot中的基础知识【一】

    写在前面 笔者在学校里学习Spring项目的时候,基本上都是老师照着书念PPT,然后演示一些有限的课堂案例,笔者印象很深刻,学校里整个Spring项目也就做了留个课堂练习,而且难度基本上属于连接上数据 ...