go如何使用gin結(jié)合jwt做登錄功能簡(jiǎn)單示例
1、安裝gin
go get -u github.com/gin-gonic/gin
2、安裝session
go get github.com/gin-contrib/sessions
3、安裝JWT鑒權(quán)
go get "github.com/golang-jwt/jwt/v4"
4、創(chuàng)建一個(gè)jwt的工具文件
package utils import ( "errors" "github.com/golang-jwt/jwt/v4" "time" ) type MyClaims struct { Phone string `json:"phone"` jwt.RegisteredClaims // 注意!這是jwt-go的v4版本新增的,原先是jwt.StandardClaims } var MySecret = []byte("wjdsg") // 定義secret,后面會(huì)用到 func Secret() jwt.Keyfunc { return func(token *jwt.Token) (interface{}, error) { return []byte(MySecret), nil // 這是我的secret } } // 這里傳入的是手機(jī)號(hào),因?yàn)槲翼?xiàng)目登陸用的是手機(jī)號(hào)和密碼 func MakeToken(phone string) (tokenString string, err error) { claim := MyClaims{ Phone: phone, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(3 * time.Hour * time.Duration(1))), // 過(guò)期時(shí)間3小時(shí) IssuedAt: jwt.NewNumericDate(time.Now()), // 簽發(fā)時(shí)間 NotBefore: jwt.NewNumericDate(time.Now()), // 生效時(shí)間 }} token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim) // 使用HS256算法 tokenString, err = token.SignedString(MySecret) return tokenString, err } // 解析jwt func ParseToken(tokenss string) (*MyClaims, error) { token, err := jwt.ParseWithClaims(tokenss, &MyClaims{}, Secret()) if err != nil { if ve, ok := err.(*jwt.ValidationError); ok { if ve.Errors&jwt.ValidationErrorMalformed != 0 { return nil, errors.New("非法令牌") } else if ve.Errors&jwt.ValidationErrorExpired != 0 { return nil, errors.New("令牌國(guó)企") } else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 { return nil, errors.New("令牌未激活") } else { return nil, errors.New("令牌未知錯(cuò)誤") } } } if claims, ok := token.Claims.(*MyClaims); ok && token.Valid { return claims, nil } return nil, errors.New("couldn't handle this token") }
5、開(kāi)始使用
package main import ( "awesomeProject/utils" "fmt" "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" "net/http" ) func main() { // 初始化gin服務(wù) rootRouter := gin.Default() // 創(chuàng)建cookie存儲(chǔ) store := cookie.NewStore([]byte("secret")) //路由上加入session中間件 rootRouter.Use(sessions.Sessions("mysession", store)) //配置路由組 group := rootRouter.Group("/wjdsg") { group.GET("/set", func(context *gin.Context) { session := sessions.Default(context) token, err := utils.MakeToken("15088888888") if err != nil { fmt.Println("jwt生產(chǎn)錯(cuò)誤") } //將jwt保持到session中 session.Set("adminId", token) session.Save() context.JSON(http.StatusOK, token) }) group.GET("/get", func(context *gin.Context) { //獲取jwt session := sessions.Default(context) token := session.Get("adminId").(string) //解析jwt parseToken, err := utils.ParseToken(token) if err != nil { fmt.Println("jwt解析錯(cuò)誤:", err) } m := make(map[string]interface{}) m["jwt"] = token m["解析"] = parseToken context.JSON(http.StatusOK, m) }) } //啟動(dòng)http服務(wù),可以修改端口 address := fmt.Sprintf(":%d", 8080) rootRouter.Run(address) }
6、結(jié)果
總結(jié)
到此這篇關(guān)于go如何使用gin結(jié)合jwt做登錄功能的文章就介紹到這了,更多相關(guān)go gin結(jié)合jwt做登錄功能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語(yǔ)言實(shí)現(xiàn)markdown解析庫(kù)的方法示例
這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)markdown解析庫(kù)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02淺談Go連接池的設(shè)計(jì)與實(shí)現(xiàn)
本文主要介紹了淺談Go連接池的設(shè)計(jì)與實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04詳解如何使用Go語(yǔ)言進(jìn)行文件監(jiān)控和通知
在Go語(yǔ)言中,文件監(jiān)控通常涉及到文件系統(tǒng)事件的監(jiān)聽(tīng),文件或目錄的狀態(tài)發(fā)生變化(如創(chuàng)建、刪除、修改等)時(shí),你的程序需要得到通知,所以本文給大家介紹了如何使用Go語(yǔ)言進(jìn)行文件監(jiān)控和通知,需要的朋友可以參考下2024-06-06golang 監(jiān)聽(tīng)服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說(shuō)明詳解
這篇文章主要介紹了golang 監(jiān)聽(tīng)服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說(shuō)明詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05Gin golang web開(kāi)發(fā)模型綁定實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Gin golang web開(kāi)發(fā)模型綁定實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10詳解Golang中errors包如何返回自定義error類(lèi)型
這篇文章主要為大家詳細(xì)介紹了Golang中errors包如何返回自定義error類(lèi)型,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09golang 執(zhí)行命令行的實(shí)現(xiàn)
本文主要介紹了golang 執(zhí)行命令行的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08