91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

赤峰市| 新乡市| 灵武市| 仪征市| 青铜峡市| 宁强县| 腾冲县| 遵义县| 年辖:市辖区| 东阿县| 阿克苏市| 麟游县| 固镇县| 泊头市| 马山县| 东宁县| 布拖县| 文成县| 琼海市| 朝阳区| 黄石市| 堆龙德庆县| 涿鹿县| 桐柏县| 焦作市| 仙居县| 常熟市| 克什克腾旗| 闸北区| 彩票| 尖扎县| 白沙| 囊谦县| 泰安市| 北票市| 教育| 资源县| 高邮市| 大理市| 古田县| 华亭县|