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

Go語言學習之golang-jwt/jwt的教程分享

 更新時間:2023年01月14日 14:02:21   作者:海生  
jwt是?json?web?token的簡稱。go使用jwt目前,主流使用的jwt庫是golang-jwt/jwt。本文就來和大家講講golang-jwt/jwt的具體使用,需要的可以參考一下

一、介紹

jwt是 json web token的簡稱。

go使用jwt目前,主流使用的jwt庫是golang-jwt/jwt

1.1 如何安裝

go get -u github.com/golang-jwt/jwt/v4

1.2 import到項目里

import "github.com/golang-jwt/jwt/v4"

1.3 主流2類加密算法介紹

加密算法代表算法加解密
對稱加密算法(hash加密) hsaHS256(最常用), HS384, HS512期望[]byte用于簽名和驗證的值
非對稱簽名方法 rsaRS256(最常用), RS384,RS512rsa.PrivateKey用于簽名和*rsa.PublicKey驗證

二、代碼實現(xiàn) -對稱加密 hsa(hash加密)

2.1 加密生成token

我們使用 NewWithClaims(method SigningMethod, claims Claims) *Token來生成token,官方的源碼如下

// NewWithClaims creates a new Token with the specified signing method and claims.
func NewWithClaims(method SigningMethod, claims Claims) *Token {
    return &Token{
        Header: map[string]interface{}{
            "typ": "JWT",
            "alg": method.Alg(),
        },
        Claims: claims,
        Method: method,
    }
}

其中我們需要 傳入一個 SigningMethod 加密算法,以及一個 Claims,需要加密的內容。

SigningMethod 我們這里使用 hsa256 哈希加盟

Claims 我們封裝一個 UserClaims 如下

我們調用NewWithClaims生成token代碼如下:

func TestHs256(t *testing.T) {
    type User struct {
        Id   int64
        Name string
    }
    type UserClaims struct {
        User User
        jwt.RegisteredClaims
    }
    // 1 jwt.NewWithClaims生成token
    user := User{
        Id:   101,
        Name: "hisheng",
    }
    userClaims := UserClaims{
        User:             user,
        RegisteredClaims: jwt.RegisteredClaims{},
    }
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, userClaims)

    // 2 把token加密
    mySigningKey := []byte("ushjlwmwnwht")
    ss, err := token.SignedString(mySigningKey)
    t.Log(ss, err)
}

生成token分為兩部分

1.使用jwt.NewWithClaims生產jwt.ToKen

2.把jwt.ToKen加密(這里我們需要添加一個加密key,使用base64url加密)

最后我們就得到了加密后的token,可以用來給客戶端使用。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyIjp7IklkIjoxMDEsIk5hbWUiOiJoaXNoZW5nIn19.ij1kWID03f_CiELe0fPLZJ-Y64dkf2nDE-f6nGERBSE

token令牌由三部分組成,由.分隔。

前兩部分是 JSON 對象,已經過base64url編碼。

最后一部分是簽名,以相同的方式編碼。

2.2 解密token得到原始數(shù)據(jù)

我們使用官方的jwt.ParseWithClaims()來解密token,官方文檔源代碼如下:

func TestHs256Parse(t *testing.T) {
    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyIjp7IklkIjoxMDEsIk5hbWUiOiJoaXNoZW5nIn19.ij1kWID03f_CiELe0fPLZJ-Y64dkf2nDE-f6nGERBSE"

    type User struct {
        Id   int64
        Name string
    }
    type UserClaims struct {
        User User
        jwt.RegisteredClaims
    }

    token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
        return []byte("ushjlwmwnwht"), nil
    })

    if userClaims, ok := token.Claims.(*UserClaims); ok && token.Valid {
        t.Log(userClaims, userClaims.RegisteredClaims.Issuer)
    } else {
        t.Log(err)
    }
}

jwt.ParseWithClaims是parser.ParseWithClaims封裝,可以自己再封裝一個parser,上面的代碼可以用下面的代碼代替。

func TestHs256Parse2(t *testing.T) {
    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyIjp7IklkIjoxMDEsIk5hbWUiOiJoaXNoZW5nIn19.ij1kWID03f_CiELe0fPLZJ-Y64dkf2nDE-f6nGERBSE"

    type User struct {
        Id   int64
        Name string
    }
    type UserClaims struct {
        User User
        jwt.RegisteredClaims
    }

    parser := jwt.NewParser()
    token, err := parser.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
        return []byte("ushjlwmwnwht"), nil
    })

    if userClaims, ok := token.Claims.(*UserClaims); ok && token.Valid {
        t.Log(userClaims, userClaims.RegisteredClaims.Issuer)
    } else {
        t.Log(err)
    }
}

我們在 parser := jwt.NewParser()的時候,可以帶上參數(shù),比如parser := jwt.NewParser(WithoutClaimsValidation)// 跳過聲明驗證(驗證過期時間、發(fā)表時間、在此之前時間)

三、代碼實現(xiàn) -非對稱加密 rsa(我們這里使用rsa256)

2.1 生成 rsa 私鑰和公鑰

生成私鑰

openssl genrsa -out private-key.pem

生成公鑰

openssl rsa -in private-key.pem -pubout -out public-key.pem

2.2 加密生成token

func TestRs256(t *testing.T) {
    type User struct {
        Id   int64
        Name string
    }
    type UserClaims struct {
        User User
        jwt.RegisteredClaims
    }
    // 1 jwt.NewWithClaims生成token
    user := User{
        Id:   101,
        Name: "hisheng",
    }
    userClaims := UserClaims{
        User:             user,
        RegisteredClaims: jwt.RegisteredClaims{},
    }

    // Read Private Key
    privateKeyDataPem, err := ioutil.ReadFile("private-key.pem")
    if err != nil {
        log.Fatal(err)
    }
    // ParseRSAPrivateKeyFromPEM
    privateKeyData, err := jwt.ParseRSAPrivateKeyFromPEM(privateKeyDataPem)
    if err != nil {
        log.Fatal(err)
    }
    // 2 把token加密
    token, err := jwt.NewWithClaims(jwt.SigningMethodRS256, userClaims).SignedString(privateKeyData)
    t.Log(token, err)
}

2.2 解密token

func TestRs256Parse(t *testing.T) {
    tokenString := "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyIjp7IklkIjoxMDEsIk5hbWUiOiJoaXNoZW5nIn19.GOS-d7iwaLDCSaSsBpArbtH-3JlD1KFNoJeyZjQ6Xv4XySo599WY784mVj-rR9kxtLYmkdAG3dPG9am6NZubHBLYWDi9b1w5gXcC7o3nAZirFGgS7bwf-7DmEetwUWzJZe-QXr1CIiVyHPU2ZCketYkIqgMGixVNfxfS5pJ5LhiUM_7J9Zlf5Kq15P9Y7U35Nu25-UXGgs-BHvH-Db6PJ4vHZq-dla_yuqRN276JBxdc24SEnML_iOHmgXVOXEWjtC_p6LmsP0VGMqwXAHN4FH0XbMzpQtTQKJgskggI41T1Ruzb9zpzJdmiL2DkeMgbvc0xVzV3CjM_AA5cUqcZaQ"
    type User struct {
        Id   int64
        Name string
    }
    type UserClaims struct {
        User User
        jwt.RegisteredClaims
    }

    token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
        // Read public Key
        publicKeyDataPem, err := ioutil.ReadFile("public-key.pem")
        if err != nil {
            log.Fatal(err)
        }
        // ParseRSAPublicKeyFromPEM
        return jwt.ParseRSAPublicKeyFromPEM(publicKeyDataPem)
    })

    if userClaims, ok := token.Claims.(*UserClaims); ok && token.Valid {
        t.Log(userClaims, userClaims.RegisteredClaims.Issuer)
    } else {
        t.Log(err)
    }

}

到此這篇關于Go語言學習之golang-jwt/jwt的教程分享的文章就介紹到這了,更多相關Go語言  golang-jwt/jwt內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go編譯原理之函數(shù)內聯(lián)

    Go編譯原理之函數(shù)內聯(lián)

    這篇文章主要為大家介紹了Go編譯原理之函數(shù)內聯(lián)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • golang中實現(xiàn)給gif、png、jpeg圖片添加文字水印

    golang中實現(xiàn)給gif、png、jpeg圖片添加文字水印

    這篇文章主要介紹了golang中實現(xiàn)給gif、png、jpeg圖片添加文字水印,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Golang中實現(xiàn)簡單的Http Middleware

    Golang中實現(xiàn)簡單的Http Middleware

    本文主要針對Golang的內置庫 net/http 做了簡單的擴展,實現(xiàn)簡單的Http Middleware,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 詳解Go語言中net/http包的使用

    詳解Go語言中net/http包的使用

    Go語言內置的?net/http?包十分的優(yōu)秀,提供了HTTP客戶端和服務端的實現(xiàn),本文主要就來和大家聊聊net/http包的使用,感興趣的可以了解一下
    2023-07-07
  • Go如何實現(xiàn)HTTP請求限流示例

    Go如何實現(xiàn)HTTP請求限流示例

    本篇文章主要介紹了Go如何實現(xiàn)HTTP請求限流示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Golang使用zlib壓縮和解壓縮字符串

    Golang使用zlib壓縮和解壓縮字符串

    本文給大家分享的是Golang使用zlib壓縮和解壓縮字符串的方法和示例,有需要的小伙伴可以參考下
    2017-02-02
  • 從零封裝Gin框架實現(xiàn)數(shù)據(jù)庫初始化GORM

    從零封裝Gin框架實現(xiàn)數(shù)據(jù)庫初始化GORM

    這篇文章主要為大家介紹了從零封裝Gin框架實現(xiàn)數(shù)據(jù)庫初始化GORM,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Golang結合ip2region實現(xiàn)ip歸屬地查詢

    Golang結合ip2region實現(xiàn)ip歸屬地查詢

    ip2region - 是一個離線IP地址定位庫和IP定位數(shù)據(jù)管理框架,提供了眾多主流編程語言的 xdb 數(shù)據(jù)生成和查詢客戶端實現(xiàn),下面我們就來看看Golang如何結合ip2region實現(xiàn)ip歸屬地查詢吧
    2024-03-03
  • golang抓取tcp包的實現(xiàn)方式

    golang抓取tcp包的實現(xiàn)方式

    使用`golang`的`packet`和`pcap`庫可以抓取TCP數(shù)據(jù)包,首先,確保安裝了`pcap`庫,然后使用以下代碼打開網絡接口,設置過濾規(guī)則為“tcp”,開始捕獲并解析TCP數(shù)據(jù)包,運行代碼時需要管理員權限
    2024-12-12
  • 詳解如何利用GORM實現(xiàn)MySQL事務

    詳解如何利用GORM實現(xiàn)MySQL事務

    為了確保數(shù)據(jù)一致性,在項目中會經常用到事務處理,對于MySQL事務相信大家應該都不陌生。這篇文章主要總結一下在Go語言中Gorm是如何實現(xiàn)事務的;感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-09-09

最新評論

沁源县| 栾城县| 高密市| 和平区| 远安县| 新密市| 华阴市| 扎赉特旗| 祁门县| 黎川县| 公主岭市| 上思县| 老河口市| 利津县| 鄂伦春自治旗| 托里县| 贺兰县| 平潭县| 营口市| 三穗县| 长春市| 石渠县| 凌海市| 晋城| 河间市| 乌兰县| 于田县| 民和| 巩留县| 青浦区| 西乌| 萍乡市| 独山县| 托里县| 肥东县| 黄梅县| 邓州市| 团风县| 宝丰县| 巩义市| 浠水县|