golang-jwt是go语言中用来生成和解析jwt的一个第三方库。本文中使用目前最新的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. golang中jwt使用

    golang 中jwt使用方式总结. 1. golang示例代码 import ( "fmt" "time" "github.com/dgrijalv ...

  2. Go实战--golang中使用JWT(JSON Web Token)

    http://blog.csdn.net/wangshubo1989/article/details/74529333 之前写过关于golang中如何使用cookie的博客: 实战–go中使用cook ...

  3. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  4. 基于gin的golang web开发:认证利器jwt

    JSON Web Token(JWT)是一种很流行的跨域认证解决方案,JWT基于JSON可以在进行验证的同时附带身份信息,对于前后端分离项目很有帮助. eyJhbGciOiJIUzI1NiIsInR5 ...

  5. golang简单实现jwt验证(beego、xorm、jwt)

    程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息. app.conf文件内容(可以用个beego直接读取里面的内容)写的是一个jwt的se ...

  6. golang前后端jwt对接

    0x0 什么是jwt JWT是JSON Web Token的缩写,可以用作授权认证.传统的授权认证一般采用session,由于session存储在服务端,加大了服务端的计算量, 而且多台服务器之间存在 ...

  7. golang jwt

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

  8. 【GoLang】go 微服务框架 && Web框架学习资料

    参考资料: 通过beego快速创建一个Restful风格API项目及API文档自动化:  http://www.cnblogs.com/huligong1234/p/4707282.html Go 语 ...

  9. golang web实战之二(iris)

    之前写了一篇为:golang web实战之一(beego,mvc postgresql) 听说iris更好: 1.  iris hello world package main import &quo ...

  10. golang 框架 之 CHI

    1,特性 golang 的 http框架已经有很多,究其原因:go 的net/http 已经做了大部分工作,封装一个框架的工作量,没有那么的大. 不过呢,林子大了鸟也就多了,部分框架的代码质量实在不敢 ...

随机推荐

  1. 全网最适合入门的面向对象编程教程:44 Python内置函数与魔法方法-重写内置类型的魔法方法

    全网最适合入门的面向对象编程教程:44 Python 内置函数与魔法方法-重写内置类型的魔法方法 摘要: 在 Python 中,内置类型的行为是通过一组特殊的"魔法方法"来实现的, ...

  2. 《SpringCloud微服务之间相互调用》之Feign实战

    一.场景再现 假设我们有这样一个场景: 用户付款成功后,扣除用户金额,还要减少仓库数量.按照微服务的设计理念,用户具有至少以下3个服务(项目): 1.订单 2.账户 3.仓库 微服务之间都是相互独立的 ...

  3. RxJS 系列 – Utility Operators

    前言 前几篇介绍过了 Creation Operators Filtering Operators Join Creation Operators Error Handling Operators T ...

  4. Facebook – Reviews (Graph API)

    前言 企业网站经常需要放 customer reviews 来增加 conversion. 常见的 Reviews 平台有 Facebook Reviews 和 Google Reviews. 这篇, ...

  5. 处理英文中的单数复数 (pluralize, singular plural)

    因为英语很烂, 有时候很烦这个. 如果是 hard code 的情况, 如果我不清楚的话就会去这里找 https://www.wordhippo.com/what-is/the-plural-of/l ...

  6. ++i与i++在效率上的细微差别

    在一些特定的使用中, i++ 可能将原值用中间量存起来以待使用,下面看相关程序的汇编代码(使用 gcc ). i++ 源程序: #include <stdio.h> int main(){ ...

  7. 第16天:信息打点-CDN绕过&业务部署&漏洞回链&接口探针&全网扫描&反向邮件

    #CDN配置: 配置1:加速域名-需要启用加速的域名 配置2:加速区域-需要启用加速的地区 配置3:加速类型-需要启用加速的资源 #参考知识: 超级Ping:http://www.17ce.com/ ...

  8. SXYZ-6.28训练赛

    今天上午出中考成绩,所以下午打了一场训练赛,只有两个小时,没有昨天毒瘤,但也很毒瘤(还是模拟赛好) 关于中考可以看我的中考游记 (为了保护隐私,以后都把姓名涂掉) 为什么还是倒数啊~ T1 binar ...

  9. 深入理解Linux进程调度(下)

    一.SMP管理 在继续讲解之前,我们先来说一下多CPU管理(这里的CPU是指逻辑CPU,在很多语境中CPU都是默认指的逻辑CPU,物理CPU要特别强调是物理CPU).最开始的时候计算机都是单CPU的, ...

  10. C#的引用类型

    引用类型的基类为 Object 引用类型:类Class.接口Interface.委Delegrate.数组Array