中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言的golang-jwt/jwt庫怎么使用

發布時間:2023-01-16 09:04:48 來源:億速云 閱讀:121 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Go語言的golang-jwt/jwt庫怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Go語言的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)// 跳過聲明驗證(驗證過期時間、發表時間、在此之前時間)

三、代碼實現 -非對稱加密 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庫怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沙雅县| 克拉玛依市| 德化县| 揭东县| 赞皇县| 中方县| 深圳市| 井研县| 张掖市| 昌江| 买车| 青河县| 汉中市| 北海市| 元阳县| 东安县| 五大连池市| 东光县| 留坝县| 长葛市| 湖州市| 嘉黎县| 安达市| 神农架林区| 铜鼓县| 金昌市| 鹤壁市| 正宁县| 长子县| 上高县| 德安县| 安仁县| 元谋县| 县级市| 贡嘎县| 康定县| 万州区| 郸城县| 霍林郭勒市| 安宁市| 安福县|