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

Go語(yǔ)言學(xué)習(xí)之golang-jwt/jwt的教程分享

 更新時(shí)間:2023年01月14日 14:02:21   作者:海生  
jwt是?json?web?token的簡(jiǎn)稱(chēng)。go使用jwt目前,主流使用的jwt庫(kù)是golang-jwt/jwt。本文就來(lái)和大家講講golang-jwt/jwt的具體使用,需要的可以參考一下

一、介紹

jwt是 json web token的簡(jiǎn)稱(chēng)。

go使用jwt目前,主流使用的jwt庫(kù)是golang-jwt/jwt

1.1 如何安裝

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

1.2 import到項(xiàng)目里

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

1.3 主流2類(lèi)加密算法介紹

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

二、代碼實(shí)現(xiàn) -對(duì)稱(chēng)加密 hsa(hash加密)

2.1 加密生成token

我們使用 NewWithClaims(method SigningMethod, claims Claims) *Token來(lái)生成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,
    }
}

其中我們需要 傳入一個(gè) SigningMethod 加密算法,以及一個(gè) Claims,需要加密的內(nèi)容。

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

Claims 我們封裝一個(gè) UserClaims 如下

我們調(diào)用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生產(chǎn)jwt.ToKen

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

最后我們就得到了加密后的token,可以用來(lái)給客戶(hù)端使用。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyIjp7IklkIjoxMDEsIk5hbWUiOiJoaXNoZW5nIn19.ij1kWID03f_CiELe0fPLZJ-Y64dkf2nDE-f6nGERBSE

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

前兩部分是 JSON 對(duì)象,已經(jīng)過(guò)base64url編碼。

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

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

我們使用官方的jwt.ParseWithClaims()來(lái)解密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封裝,可以自己再封裝一個(gè)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)
    }
}

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

三、代碼實(shí)現(xiàn) -非對(duì)稱(chēng)加密 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)
    }

}

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

相關(guān)文章

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

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

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

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

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

    Golang中實(shí)現(xiàn)簡(jiǎn)單的Http Middleware

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

    詳解Go語(yǔ)言中net/http包的使用

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

    Go如何實(shí)現(xiàn)HTTP請(qǐng)求限流示例

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

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

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

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

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

    Golang結(jié)合ip2region實(shí)現(xiàn)ip歸屬地查詢(xún)

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

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

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

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

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

最新評(píng)論

金华市| 泾川县| 济宁市| 广南县| 辽源市| 瑞金市| 察雅县| 叶城县| 正镶白旗| 青海省| 周宁县| 大石桥市| 嘉荫县| 乌兰浩特市| 蓬莱市| 阜新市| 八宿县| 高青县| 沂南县| 商洛市| 金阳县| 武宁县| 吴堡县| 常山县| 商南县| 虎林市| 图木舒克市| 安丘市| 宝应县| 雷山县| 汾西县| 南川市| 沁水县| 信丰县| 沈丘县| 临沧市| 甘谷县| 中阳县| 定兴县| 五大连池市| 凯里市|