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

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驗證

二、代碼實現 -對稱加密 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得到原始數據

我們使用官方的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()的時候,可以帶上參數,比如parser := jwt.NewParser(WithoutClaimsValidation)// 跳過聲明驗證(驗證過期時間、發(fā)表時間、在此之前時間)

三、代碼實現 -非對稱加密 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實現簡易比特幣區(qū)塊鏈公鏈功能

    使用go實現簡易比特幣區(qū)塊鏈公鏈功能

    這篇文章主要介紹了使用go實現簡易比特幣區(qū)塊鏈公鏈功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • go語言題解LeetCode66加一示例詳解

    go語言題解LeetCode66加一示例詳解

    這篇文章主要為大家介紹了go語言題解LeetCode66加一示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • golang context接口類型方法介紹

    golang context接口類型方法介紹

    這篇文章主要為大家介紹了golang context接口類型方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Go語言中go?mod?vendor使用方法

    Go語言中go?mod?vendor使用方法

    go mod vendor的功能是將新增的依賴包自動寫入當前項目的 vendor目錄,下面這篇文章主要給大家介紹了關于Go語言中go?mod?vendor使用的相關資料,需要的朋友可以參考下
    2022-10-10
  • 手把手帶你走進Go語言之語法基礎解析

    手把手帶你走進Go語言之語法基礎解析

    這篇文章主要介紹了手把手帶你走進Go語言之語法基礎,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Golang基礎之函數使用(參數傳值)實例詳解

    Golang基礎之函數使用(參數傳值)實例詳解

    這篇文章主要為大家介紹了Golang基礎之函數使用(參數傳值)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 詳解Golang中string的實現原理與高效使用

    詳解Golang中string的實現原理與高效使用

    在Go語言中,無論是字符串常量、字符串變量還是代碼中出現的字符串字面量,它們的類型都被統(tǒng)一設置為string,下面就跟隨小編一起來了解一下Golang中string的實現原理與高效使用吧
    2024-01-01
  • golang redigo發(fā)布訂閱使用的方法

    golang redigo發(fā)布訂閱使用的方法

    本文主要介紹了golang redigo發(fā)布訂閱使用的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • golang基礎之Gocurrency并發(fā)

    golang基礎之Gocurrency并發(fā)

    這篇文章主要介紹了golang基礎之Gocurrency并發(fā),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • golang包快速生成base64驗證碼的方法

    golang包快速生成base64驗證碼的方法

    這篇文章主要介紹了golang包快速生成base64驗證碼的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03

最新評論