惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
N
News and Events Feed by Topic
D
DataBreaches.Net
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Engineering at Meta
Engineering at Meta
T
Tailwind CSS Blog
博客园_首页
Microsoft Azure Blog
Microsoft Azure Blog
Y
Y Combinator Blog
博客园 - Franky
Hugging Face - Blog
Hugging Face - Blog
月光博客
月光博客
A
About on SuperTechFans
I
InfoQ
S
Securelist
Last Week in AI
Last Week in AI
S
Schneier on Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
Hacker News: Ask HN
Hacker News: Ask HN
Schneier on Security
Schneier on Security
Know Your Adversary
Know Your Adversary
腾讯CDC
大猫的无限游戏
大猫的无限游戏
S
Security @ Cisco Blogs
博客园 - 三生石上(FineUI控件)
Simon Willison's Weblog
Simon Willison's Weblog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tor Project blog
美团技术团队
aimingoo的专栏
aimingoo的专栏
G
Google Developers Blog
罗磊的独立博客
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
S
Secure Thoughts
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Latest news
Latest news
Recent Announcements
Recent Announcements
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
LINUX DO - 热门话题
Security Latest
Security Latest
TaoSecurity Blog
TaoSecurity Blog
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队

ike‘s blog

mac软件推荐 用Siri来控制Windows电脑开机关机吧 clickhouse的一些优化建议和工具 2023sumppary 记录一下我的第一个网页游戏Mazeball 如何使用Clickhouse的索引 如何从zookeeper切换为clickhouse—keeper cloki分布式查询和clickhouse副本存储 使用ilogtail+cloki+clickhouse来做日志系统吧 clickhouse集群部署指南 快速安装部署clickhouse和cloki 快速部署thanos架构 如何修改git commit记录 业务容器化需要注意的一些地方 游戏企划 Prometheus Metrics精简优化2 来在线听音乐吧 Chatgpt的API入门 简单搭建国内也可以使用的chatgpt Prometheus Metrics精简优化 Kubernetes的探针机制 本地部署chatAI【chatglm】 AI绘画工具webui简单入门 之 高清化 写在地下城邂逅Ⅳ·灾厄篇·完结之后 如何部署gitalk作为评论系统 AI绘画工具webui简单入门 之 工具安装 grafanadb迁移到mysql kubectl常用命令 开始写博客啦 隐私政策URL Markdown Example Include Video in the Posts Markdown Extended Features Simple Guides for Fuwari Golang net/http & HTTP Serve 源码分析
如何使用go的jwt
ike · 2023-07-04 · via ike‘s blog

JWT 是一种轻量级的身份认证和授权机制,它可以在不同的系统之间安全地传递信息,JWT 的信息是以 JSON 格式存储在 Token 中,包含三部分:头部(header)、载荷(payload)和签名(signature)。其中,载荷部分包含了一些声明信息,比如 Token 的有效期、Token 的颁发者、Token 的使用者等。

jwt bearer和bearer token的区别#

Bearer是HTTP授权标头的一种类型,用于指示在HTTP请求中使用OAuth 2.0访问令牌进行身份验证。

JWT Bearer是使用JSON Web Token(JWT)进行身份验证的一种方式,它将JWT作为Bearer令牌的值发送到服务器。

Bearer Token则是OAuth 2.0协议中使用的一种访问令牌类型,它表示访问令牌的类型是Bearer。Bearer Token是一种无状态的令牌,它通常具有一定的有效期,在有效期内可以使用该令牌进行身份验证和授权。Bearer Token可以使用各种技术实现,如JWT、OAuth 2.0、OpenID Connect等。

这里我们用的就是Bearer Token

安装jwt包#

go get github.com/dgrijalva/jwt-go

一般jwt是配合go gin一起使用的

如何使用jwt#


import (
	"time"

	"github.com/dgrijalva/jwt-go"
)


type TokenInterface interface {
	GenerateToken(id int, accountName string) (string, error)
	ParseToken(token string) (*Claims, error)
}

type Token struct {
	JwtSecret  string // 加密秘钥
	ExpireTime int    // 多少小时过期
}

func NewToken(f ...func(token *Token)) TokenInterface {
	t := &Token{}
	for _, i := range f {
		i(t)
	}
	// 未赋值则初始化
	if t.ExpireTime == 0 {
		t.ExpireTime = 24
	}
	if t.JwtSecret == "" {
		t.JwtSecret = "JwtSecret"
	}
	return t
}

type Claims struct {
	UserID      int    `json:"user_id"`
	AccountName string `json:"account_name"`
	jwt.StandardClaims
}

// GenerateToken 生成Token
func (t *Token) GenerateToken(id int, accountName string) (string, error) {
	nowTime := time.Now()
	expireTime := nowTime.Add(time.Duration(t.ExpireTime) * time.Hour)

	claims := Claims{
		UserID:      id,
		AccountName: accountName,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(),
			Issuer:    "my-project",
		},
	}

	tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	token, err := tokenClaims.SignedString([]byte(t.JwtSecret))

	return token, err
}

// ParseToken 解析Token
func (t *Token) ParseToken(token string) (*Claims, error) {
	tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
		return []byte(t.JwtSecret), nil
	})

	if tokenClaims != nil {
		if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {
			return claims, nil
		}
	}
	return nil, err
}
func ValidatorQueryInfo(ctx *gin.Context) {

	authHeader := ctx.Request.Header.Get("Authorization")
	if authHeader == "" {
		err = errors.New("请求头中的auth为空")
		return
	}
	parts := strings.SplitN(authHeader, " ", 2)
	if !(len(parts) == 2 && parts[0] == "Bearer") {
		err = errors.New("请请求头中的auth格式错误")
		return
	}
	t := jwt.NewToken()
	claims, err := t.ParseToken(parts[1])
	if err != nil {
		err = errors.New("无效的token")
		return
	}
	log.DefaultLogs.Log.Error("jwt解析正常", claims)
	return
}