在Go中使用jwt的教程詳解
生成 token 一般用 jwt,常用的兩種加密方式是 HS256 和 RS256,借助 "github.com/golang-jwt/jwt/v5" 這個庫來實現(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) 過期時間sub: (subject) 主題aud: (audience) 受眾nbf: (Not Before) 生效時間iat: (Issued At) 簽發(fā)時間jti: (JWT ID) 編號
- 自定義字段
user: 用戶信息
- 例如
{
"exp": 1718254332,
"iat": 1718167932,
"user": {
"email": "jack@gmial.com",
"username": "jack22ssss22"
}
}
signature簽名,這個簽名不能泄漏,否則會被篡改
完整的 jwt 就是把這三部分組合起來 HMACSHA256(base64UrlEncode(Header).base64UrlEncode(Payload).Signature)
HS256 加密
HS256 是一種對稱加密算法,使用秘密密鑰對每條消息進(jì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)
}
驗證 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 是一種非對稱加密算法,使用私鑰加密明文,公鑰解密密文
安裝 openssl
apt install openssl
生成 rsa 私鑰
在當(dāng)前目錄下生成一個 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)
}
驗證 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的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go 代碼規(guī)范錯誤處理示例經(jīng)驗總結(jié)
這篇文章主要為大家介紹了Go 代碼規(guī)范錯誤處理示例實戰(zhàn)經(jīng)驗總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
深入了解Golang網(wǎng)絡(luò)編程Net包的使用
net包主要是增加?context?控制,封裝了一些不同的連接類型以及DNS?查找等等,同時在有需要的地方引入?goroutine?提高處理效率。本文主要和大家分享下在Go中網(wǎng)絡(luò)編程的實現(xiàn),需要的可以參考一下2022-07-07
Golang信號處理及如何實現(xiàn)進(jìn)程的優(yōu)雅退出詳解
這篇文章主要給大家介紹了關(guān)于Golang信號處理及如何實現(xiàn)進(jìn)程的優(yōu)雅退出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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)使用,希望對大家有所幫助2023-09-09
基于Go+OpenCV實現(xiàn)人臉識別功能的詳細(xì)示例
OpenCV是一個強大的計算機(jī)視覺庫,提供了豐富的圖像處理和計算機(jī)視覺算法,本文將向你介紹在Mac上安裝OpenCV的步驟,并演示如何使用Go的OpenCV綁定庫進(jìn)行人臉識別,需要的朋友可以參考下2023-07-07
VsCode搭建Go語言開發(fā)環(huán)境的配置教程
這篇文章主要介紹了在VsCode中搭建Go開發(fā)環(huán)境的配置教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05

