欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言中JWT的創(chuàng)建和解析操作詳解

 更新時間:2023年05月19日 08:57:20   作者:三杯溫開水  
JWT的全名是Json web token,是為了在網(wǎng)絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準,這篇文章主要介紹了在Go語言中JWT的創(chuàng)建和解析操作,感興趣的同學可以參考下文

JWT介紹

Json web token (JWT), 是為了在網(wǎng)絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準.該token被設計為緊湊且安全的,特別適用于分布式站點的單點登錄場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業(yè)務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。下面就以一個標準的jwt功能實現(xiàn)方式進行編碼。并且這個jwt也會相對安全一點,因為是有加密過的。一般用戶登錄后生成的token都是需要進行加密的,每一次訪問,服務端都會根據(jù)前端的請求做出對應的策略,避免一定的非必要腳本攻擊。

JWT相對于Cookie和Session的優(yōu)點

Cookie和Session存放在哪,相對于JWT有啥區(qū)別?

Cookie是儲存在客戶端的,Session是儲存在服務端的。

Cookie:

1、客戶端請求服務器后,如果服務器需要記錄用戶狀態(tài),服務器會在響應信息中包含一個Set-Cookie的響應頭

2、客戶端會根據(jù)這個響應頭存儲Cookie信息。再次請求服務器時,客戶端會在請求信息中包含一個Cookie請求頭。

Session:

反正就是服務端生成,存儲在服務器的內存中以及保存在文件或數(shù)據(jù)庫中,返回給前端儲存到cookie中

1、session是有過期時間的,可以設置過期時間或者服務器關閉就會消失

2、session多了服務端會有內存壓力,這就需要負載均衡了以及不同服務器的session共享問題。

JWT:

1、 在頭部信息中聲明加密算法和常量, 然后把header使用json轉化為字符串

2、在載荷中聲明用戶信息,同時還有一些其他的內容;再次使用json 把載荷部分進行轉化,轉化為字符串 (但是你覺得載荷中應不應該放置敏感的信息,當然不行,因為有效載荷中的內容是base64進行編碼的,并不是進行加密的,而且JWT存儲在localstorage等等,能夠被獲取到)

3、 使用在header中聲明的加密算法和每個項目隨機生成的secret來進行加密, 把第一步分字符串和第二部分的字符串進行加密, 生成新的字符串。此字符串是獨一無二的。

4、解密的時候,只要客戶端帶著JWT來發(fā)起請求,服務端就直接使用secret進行解密。

你可以這樣理解,JWT不受瀏覽器之間的令牌約束,并且其是有加密的,可以一定程度上得到保護。

 第一部分為頭部(header),第二部分我們稱其為載荷(payload),第三部分是簽證(signature)。

實現(xiàn)jwt

引入jwt-go

我們需要先引入這個go-jwt

go get "github.com/dgrijalva/jwt-go"

創(chuàng)建一個jwt.go

jwt.StandardClaims 中有很多參數(shù),可以根據(jù)自己的需要進行添加,可以查看源碼

// 設置token過期時間
const TokenExpireDuration = time.Hour * 2
var mySecret = []byte("努力學習go語言")
// 這里可以根據(jù)自己的業(yè)務做出更改
type MyClaims struct {
	UserID   int64  `json:"user_id"`
	UserName string `json:"user_name"`
	jwt.StandardClaims
}
// GenToken 生成JWT
func GenToken(userId int64, username string) (string, error) {
	// 創(chuàng)建我們自己聲明的數(shù)據(jù)
	c := MyClaims{
		userId,
		username, // 定義字段
		jwt.StandardClaims{
			IssuedAt: time.Now().Add(TokenExpireDuration).Unix(), // 過期時間
			Issuer:   "三杯溫開水",                                 // 簽發(fā)人
		},
	}
	// 使用指定的簽名方法創(chuàng)建簽名對象
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
	// 返回token
	return token.SignedString(mySecret)
}
// ParseToken 解析 JWT
func ParseToken(tokenString string) (*MyClaims, error) {
	mc := new(MyClaims)
	// 解析token
	token, err := jwt.ParseWithClaims(tokenString, mc, func(token *jwt.Token) (i interface{}, err error) {
		return mySecret, nil
	})
	if err != nil {
		return nil, err
	}
	if token.Valid { // 校驗token
		return mc, nil
	}
	return nil, errors.New("invalid token")
}

創(chuàng)建一個jwt的中間件

這個中間件一般會放置在需要用戶登錄情況下才可以進行訪問的頁面或者數(shù)據(jù),比如:個人信息功能上。下面的是基于標準版的Authorization中,并使用Bearer開頭??梢愿鶕?jù)自己的業(yè)務需求進行做出更改

// JWTAuthMiddleware 基于JWT的認證中間件
func JWTAuthMiddleware() func(c *gin.Context) {
	return func(c *gin.Context) {
		// 這里根據(jù)自己的業(yè)務進行更改
		authHeader := c.Request.Header.Get("Authorization")
		if authHeader == "" {
			controller.ResponseError(c, controller.CodeNeedLogin)
			c.Abort()
			return
		}
		// 按空格分割(基于Bearer開頭的),如果不是Bearer開頭的下面代碼可以進行省略
		// ------ start ------
		parts := strings.SplitN(authHeader, " ", 2)
		if !(len(parts) == 2 && parts[0] == "Bearer") {
			controller.ResponseError(c, controller.CodeInvalidToken)
			c.Abort()
			return
		}
		// ------ end -------
		// parts[1]是獲取到的tokenString,我們使用之前定義好的解析JWT的函數(shù)來解析它
		mc, err := jwt.ParseToken(parts[1])
		if err != nil {
			controller.ResponseError(c, controller.CodeInvalidToken)
			c.Abort()
			return
		}
		// 將當前請求的username信息保存到請求的上下文c上
		c.Set(controller.CtxUserIdKey, mc.UserID)
		c.Next() // 后續(xù)的處理函數(shù)可以用過c.Get(CtxUserIdKey)來獲取當前請求的用戶信息
	}
}

中間件引入到路由中

r.POST("/ping", JWTAuthMiddleware(), func(c *gin.Context) {
		c.String(http.StatusOK, "ok!")
	})

到此這篇關于Go語言中JWT的創(chuàng)建和解析操作詳解的文章就介紹到這了,更多相關Go JWT的創(chuàng)建和解析內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Goland 生成可執(zhí)行文件的操作

    Goland 生成可執(zhí)行文件的操作

    這篇文章主要介紹了Goland 生成可執(zhí)行文件的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 詳解Go語言如何使用標準庫sort對切片進行排序

    詳解Go語言如何使用標準庫sort對切片進行排序

    Sort?標準庫提供了對基本數(shù)據(jù)類型的切片和自定義類型的切片進行排序的函數(shù)。今天主要分享的內容是使用?Go?標準庫?sort?對切片進行排序,感興趣的可以了解一下
    2022-12-12
  • golang rate令牌桶源碼分析實現(xiàn)方式

    golang rate令牌桶源碼分析實現(xiàn)方式

    這篇文章主要介紹了golang rate令牌桶源碼分析實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • GO語言協(xié)程互斥鎖Mutex和讀寫鎖RWMutex用法實例詳解

    GO語言協(xié)程互斥鎖Mutex和讀寫鎖RWMutex用法實例詳解

    這篇文章主要介紹了GO語言協(xié)程互斥鎖Mutex和讀寫鎖RWMutex用法詳解,需要的朋友可以參考下
    2022-04-04
  • golang?run時報undefined錯誤的解決

    golang?run時報undefined錯誤的解決

    這篇文章主要介紹了golang?run時報undefined錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 如何在Golang中運行JavaScript

    如何在Golang中運行JavaScript

    最近寫一個程序,接口返回的數(shù)據(jù)是js格式的,需要通過golang來解析js,所以下面這篇文章主要給大家介紹了關于如何在Golang中運行JavaScript的相關資料,需要的朋友可以參考下
    2022-01-01
  • Golang實現(xiàn)SSH、SFTP操作小結

    Golang實現(xiàn)SSH、SFTP操作小結

    在日常的一些開發(fā)場景中,我們需要去和遠程服務器進行一些通信,本文主要介紹了Golang實現(xiàn)SSH、SFTP操作小結,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Go語言實現(xiàn)互斥鎖、隨機數(shù)、time、List

    Go語言實現(xiàn)互斥鎖、隨機數(shù)、time、List

    這篇文章主要介紹了Go語言實現(xiàn)互斥鎖、隨機數(shù)、time、List的相關資料,需要的朋友可以參考下
    2018-10-10
  • 詳解Golang中的各種時間操作

    詳解Golang中的各種時間操作

    這篇文章主要介紹了詳解Golang中的各種時間操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Go語言實現(xiàn)關閉http請求的方式總結

    Go語言實現(xiàn)關閉http請求的方式總結

    面試的時候問到如何關閉http請求,一般人脫口而出的是關閉response.body,這是錯誤的。本文為大家整理了三個正確關閉http請求的方法,希望對大家有所幫助
    2023-02-02

最新評論