亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Go中使用jwt的教程詳解

 更新時(shí)間:2024年06月13日 08:55:14   作者:uccs  
JWT (JSON Web Tokens) 是一種基于 JSON 格式的輕量級(jí)身份驗(yàn)證和授權(quán)方案,用于在各方之間以JSON方式安全地傳輸信息,本文給大家詳細(xì)介紹了在Go中使用jwt的教程,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下

生成 token 一般用 jwt,常用的兩種加密方式是 HS256RS256,借助 "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) 密鑰 ID
      • x5u: (X.509 URL) X.509 地址
      • x5c: (X.509 certificate chain) X.509 證書鏈
      • crit: (critical) 關(guān)鍵
    • 一般使用 algtype,例如
{
  "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 gRPC超時(shí)控制Deadlines用法詳解

    Go gRPC超時(shí)控制Deadlines用法詳解

    這篇文章主要為大家介紹了Go gRPC超時(shí)控制Deadlines用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go 代碼規(guī)范錯(cuò)誤處理示例經(jīng)驗(yàn)總結(jié)

    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語言并發(fā)編程 互斥鎖詳情

    Go語言并發(fā)編程 互斥鎖詳情

    在并發(fā)編程中,多個(gè)Goroutine訪問同一塊內(nèi)存資源時(shí)可能會(huì)出現(xiàn)競(jìng)態(tài)條件,我們需要在臨界區(qū)中使用適當(dāng)?shù)耐讲僮鱽硪员苊飧?jìng)態(tài)條件。Go 語言中提供了很多同步工具,本文將介紹互斥鎖Mutex和讀寫鎖RWMutex的使用方法。
    2021-10-10
  • 聊聊Go語言編譯github上的項(xiàng)目遇到的坑

    聊聊Go語言編譯github上的項(xiàng)目遇到的坑

    這篇文章主要介紹了解決Go語言編譯github上的項(xiàng)目遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go?Interface接口初學(xué)者手冊(cè)

    Go?Interface接口初學(xué)者手冊(cè)

    這篇文章主要為大家介紹了Go?Interface接口的基礎(chǔ)用法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 深入了解Golang網(wǎng)絡(luò)編程N(yùn)et包的使用

    深入了解Golang網(wǎng)絡(luò)編程N(yùn)et包的使用

    net包主要是增加?context?控制,封裝了一些不同的連接類型以及DNS?查找等等,同時(shí)在有需要的地方引入?goroutine?提高處理效率。本文主要和大家分享下在Go中網(wǎng)絡(luò)編程的實(shí)現(xiàn),需要的可以參考一下
    2022-07-07
  • Golang信號(hào)處理及如何實(shí)現(xiàn)進(jìn)程的優(yōu)雅退出詳解

    Golang信號(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庫

    詳解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ì)示例

    基于Go+OpenCV實(shí)現(xiàn)人臉識(shí)別功能的詳細(xì)示例

    OpenCV是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺庫,提供了豐富的圖像處理和計(jì)算機(jī)視覺算法,本文將向你介紹在Mac上安裝OpenCV的步驟,并演示如何使用Go的OpenCV綁定庫進(jìn)行人臉識(shí)別,需要的朋友可以參考下
    2023-07-07
  • VsCode搭建Go語言開發(fā)環(huán)境的配置教程

    VsCode搭建Go語言開發(fā)環(huán)境的配置教程

    這篇文章主要介紹了在VsCode中搭建Go開發(fā)環(huán)境的配置教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評(píng)論