最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Go中使用jwt的教程詳解

 更新時(shí)間:2024年06月13日 08:55:14   作者:uccs  
JWT (JSON Web Tokens) 是一種基于 JSON 格式的輕量級身份驗(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) 編號
  • 自定義字段
    • user: 用戶信息
  • 例如
{
  "exp": 1718254332,
  "iat": 1718167932,
  "user": {
    "email": "jack@gmial.com",
    "username": "jack22ssss22"
  }
}
  • signature 簽名,這個(gè)簽名不能泄漏,否則會(huì)被篡改

完整的 jwt 就是把這三部分組合起來 HMACSHA256(base64UrlEncode(Header).base64UrlEncode(Payload).Signature)

HS256 加密

HS256 是一種對稱加密算法,使用秘密密鑰對每條消息進(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 是一種非對稱加密算法,使用私鑰加密明文,公鑰解密密文

安裝 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的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • viper配置框架的介紹支持zookeeper的讀取和監(jiān)聽

    viper配置框架的介紹支持zookeeper的讀取和監(jiān)聽

    這篇文章主要介紹了viper配置框架的介紹支持zookeeper的讀取和監(jiān)聽,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 一文帶你了解Go語言中time包的時(shí)間常用操作

    一文帶你了解Go語言中time包的時(shí)間常用操作

    在日常開發(fā)中,我們避免不了時(shí)間的使用,我們可能需要獲取當(dāng)前時(shí)間,然后格式化保存,也可能需要在時(shí)間類型與字符串類型之間相互轉(zhuǎn)換等。本文將會(huì)對?Go?time?包里面的常用函數(shù)和方法進(jìn)行介紹,需要的可以參考一下
    2022-12-12
  • 最新評論

    益阳市| 武威市| 龙里县| 河池市| 临高县| 邮箱| 晋州市| 开化县| 娄底市| 聂拉木县| 龙江县| 漳州市| 吉林省| 仪征市| 沭阳县| 克拉玛依市| 上林县| 阿拉善右旗| 大港区| 宜阳县| 辽阳县| 阿克陶县| 精河县| 元阳县| 阳江市| 包头市| 谷城县| 陇南市| 七台河市| 太原市| 漳平市| 灵武市| 蓬莱市| 墨玉县| 嘉兴市| 连州市| 延安市| 娱乐| 偃师市| 吉首市| 西峡县|