在Go中使用jwt的教程詳解
生成 token
一般用 jwt
,常用的兩種加密方式是 HS256
和 RS256
,借助 "github.com/golang-jwt/jwt/v5"
這個(gè)庫來實(shí)現(xiàn)
jwt
由三部分組成:
header
頭部- 官方規(guī)定的字段:
alg
: (algorithm) 算法typ
: (type) 類型cty
: (content type) 內(nèi)容類型kid
: (key ID) 密鑰 IDx5u
: (X.509 URL) X.509 地址x5c
: (X.509 certificate chain) X.509 證書鏈crit
: (critical) 關(guān)鍵
- 一般使用
alg
和type
,例如
- 官方規(guī)定的字段:
{ "alg": "HS256", "typ": "JWT" }
payload
負(fù)載
- 官方規(guī)定的字段
iss
: (issuer) 簽發(fā)人exp
: (expiration time) 過期時(shí)間sub
: (subject) 主題aud
: (audience) 受眾nbf
: (Not Before) 生效時(shí)間iat
: (Issued At) 簽發(fā)時(shí)間jti
: (JWT ID) 編號(hào)
- 自定義字段
user
: 用戶信息
- 例如
{ "exp": 1718254332, "iat": 1718167932, "user": { "email": "jack@gmial.com", "username": "jack22ssss22" } }
signature
簽名,這個(gè)簽名不能泄漏,否則會(huì)被篡改
完整的 jwt
就是把這三部分組合起來 HMACSHA256(base64UrlEncode(Header).base64UrlEncode(Payload).Signature)
HS256 加密
HS256
是一種對(duì)稱加密算法,使用秘密密鑰對(duì)每條消息進(jìn)行簽名和驗(yàn)證
生成 token
func GenerateJWTHS256(username, email string) (string, error) { key := []byte("secret") tokenDuration := 24 * time.Hour now := time.Now() t := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "user": map[string]string{ "username": username, "email": email, }, "iat": now.Unix(), "exp": now.Add(tokenDuration).Unix(), }) return t.SignedString(key) }
驗(yàn)證 token
func VerifyJWTHS256(token string) (*jwt.MapClaims, bool, error) { var claim jwt.MapClaims claims, err := jwt.ParseWithClaims(token, &claim, func(t *jwt.Token) (interface{}, error) { return []byte("secret"), nil }) if err != nil { return nil, false, err } if claims.Valid { return &claim, true, nil } return nil, false, nil }
RS256 加密
RS256
是一種非對(duì)稱加密算法,使用私鑰加密明文,公鑰解密密文
安裝 openssl
apt install openssl
生成 rsa 私鑰
在當(dāng)前目錄下生成一個(gè) 2048
位的私鑰文件 private.pem
openssl genrsa -out private.pem 2048
獲取到 rsa 秘鑰
var privateKey *rsa.PrivateKey var publicKey *rsa.PublicKey func init() { var err error var bytes []byte bytes, err = os.ReadFile("/root/uccs/realworld/private.pem") if err != nil { panic(err) } privateKey, err = jwt.ParseRSAPrivateKeyFromPEM(bytes) if err != nil { panic(err) } bytes, err = os.ReadFile("/root/uccs/realworld/public.pem") if err != nil { panic(err) } publicKey, err = jwt.ParseRSAPublicKeyFromPEM(bytes) if err != nil { panic(err) } }
生成 token
func GenerateJWTRS256(username, email string) (string, error) { tokenDuration := 24 * time.Hour now := time.Now() t := jwt.NewWithClaims(jwt.SigningMethodRS256, jwt.MapClaims{ "user": map[string]string{ "username": username, "email": email, }, "iat": now.Unix(), "exp": now.Add(tokenDuration).Unix(), }) return t.SignedString(privateKey) }
驗(yàn)證 token
func VerifyJWTRS256(token string) (*jwt.MapClaims, bool, error) { var claim jwt.MapClaims claims, err := jwt.ParseWithClaims(token, &claim, func(t *jwt.Token) (interface{}, error) { return publicKey, nil }) if err != nil { return nil, false, err } if claims.Valid { return &claim, true, nil } return nil, false, nil }
以上就是在Go中使用jwt的教程詳解的詳細(xì)內(nèi)容,更多關(guān)于Go中使用jwt的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go 代碼規(guī)范錯(cuò)誤處理示例經(jīng)驗(yàn)總結(jié)
這篇文章主要為大家介紹了Go 代碼規(guī)范錯(cuò)誤處理示例實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08深入了解Golang網(wǎng)絡(luò)編程N(yùn)et包的使用
net包主要是增加?context?控制,封裝了一些不同的連接類型以及DNS?查找等等,同時(shí)在有需要的地方引入?goroutine?提高處理效率。本文主要和大家分享下在Go中網(wǎng)絡(luò)編程的實(shí)現(xiàn),需要的可以參考一下2022-07-07Golang信號(hào)處理及如何實(shí)現(xiàn)進(jìn)程的優(yōu)雅退出詳解
這篇文章主要給大家介紹了關(guān)于Golang信號(hào)處理及如何實(shí)現(xiàn)進(jìn)程的優(yōu)雅退出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03詳解golang中的結(jié)構(gòu)體編解碼神器Mapstructure庫
mapstructure是GO字典(map[string]interface{})和Go結(jié)構(gòu)體之間轉(zhuǎn)換的編解碼工具,這篇文章主要為大家介紹一下Mapstructure庫的相關(guān)使用,希望對(duì)大家有所幫助2023-09-09基于Go+OpenCV實(shí)現(xiàn)人臉識(shí)別功能的詳細(xì)示例
OpenCV是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺庫,提供了豐富的圖像處理和計(jì)算機(jī)視覺算法,本文將向你介紹在Mac上安裝OpenCV的步驟,并演示如何使用Go的OpenCV綁定庫進(jìn)行人臉識(shí)別,需要的朋友可以參考下2023-07-07VsCode搭建Go語言開發(fā)環(huán)境的配置教程
這篇文章主要介紹了在VsCode中搭建Go開發(fā)環(huán)境的配置教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05