在Go中使用jwt的教程詳解
生成 token 一般用 jwt,常用的兩種加密方式是 HS256 和 RS256,借助 "github.com/golang-jwt/jwt/v5" 這個(gè)庫(kù)來(lái)實(shí)現(xiàn)
jwt 由三部分組成:
header頭部- 官方規(guī)定的字段:
alg: (algorithm) 算法typ: (type) 類(lèi)型cty: (content type) 內(nèi)容類(lèi)型kid: (key ID) 密鑰 IDx5u: (X.509 URL) X.509 地址x5c: (X.509 certificate chain) X.509 證書(shū)鏈crit: (critical) 關(guān)鍵
- 一般使用
alg和type,例如
- 官方規(guī)定的字段:
{
"alg": "HS256",
"typ": "JWT"
}
payload 負(fù)載
- 官方規(guī)定的字段
iss: (issuer) 簽發(fā)人exp: (expiration time) 過(guò)期時(shí)間sub: (subject) 主題aud: (audience) 受眾nbf: (Not Before) 生效時(shí)間iat: (Issued At) 簽發(fā)時(shí)間jti: (JWT ID) 編號(hào)
- 自定義字段
user: 用戶(hù)信息
- 例如
{
"exp": 1718254332,
"iat": 1718167932,
"user": {
"email": "jack@gmial.com",
"username": "jack22ssss22"
}
}
signature簽名,這個(gè)簽名不能泄漏,否則會(huì)被篡改
完整的 jwt 就是把這三部分組合起來(lái) HMACSHA256(base64UrlEncode(Header).base64UrlEncode(Payload).Signature)
HS256 加密
HS256 是一種對(duì)稱(chēng)加密算法,使用秘密密鑰對(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ì)稱(chēng)加密算法,使用私鑰加密明文,公鑰解密密文
安裝 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
聊聊Go語(yǔ)言編譯github上的項(xiàng)目遇到的坑
這篇文章主要介紹了解決Go語(yǔ)言編譯github上的項(xiàng)目遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
深入了解Golang網(wǎng)絡(luò)編程N(yùn)et包的使用
net包主要是增加?context?控制,封裝了一些不同的連接類(lèi)型以及DNS?查找等等,同時(shí)在有需要的地方引入?goroutine?提高處理效率。本文主要和大家分享下在Go中網(wǎng)絡(luò)編程的實(shí)現(xiàn),需要的可以參考一下2022-07-07
Golang信號(hào)處理及如何實(shí)現(xiàn)進(jìn)程的優(yōu)雅退出詳解
這篇文章主要給大家介紹了關(guān)于Golang信號(hào)處理及如何實(shí)現(xiàn)進(jìn)程的優(yōu)雅退出的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
詳解golang中的結(jié)構(gòu)體編解碼神器Mapstructure庫(kù)
mapstructure是GO字典(map[string]interface{})和Go結(jié)構(gòu)體之間轉(zhuǎn)換的編解碼工具,這篇文章主要為大家介紹一下Mapstructure庫(kù)的相關(guān)使用,希望對(duì)大家有所幫助2023-09-09
基于Go+OpenCV實(shí)現(xiàn)人臉識(shí)別功能的詳細(xì)示例
OpenCV是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺(jué)庫(kù),提供了豐富的圖像處理和計(jì)算機(jī)視覺(jué)算法,本文將向你介紹在Mac上安裝OpenCV的步驟,并演示如何使用Go的OpenCV綁定庫(kù)進(jìn)行人臉識(shí)別,需要的朋友可以參考下2023-07-07
VsCode搭建Go語(yǔ)言開(kāi)發(fā)環(huán)境的配置教程
這篇文章主要介紹了在VsCode中搭建Go開(kāi)發(fā)環(huán)境的配置教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05

