golang整合jwt的實(shí)現(xiàn)示例
快速開始
下載包
go get github.com/dgrijalva/jwt-go
直接上代碼
package main import ( "fmt" "time" "github.com/dgrijalva/jwt-go" ) // 定義一個(gè)結(jié)構(gòu)體 實(shí)現(xiàn)jwt.StandardClaims type MyClaims struct { UserName string jwt.StandardClaims } const ( SECRETKEY = "ghdrgdrgdrg34" //私鑰 ) func main() { // 生成token token, _ := GenerateToken() // 解析token c2, err := ParseToken(token) if err != nil { fmt.Println("token解析失敗", err.Error()) } fmt.Println(c2.UserName) } // 生成token func GenerateToken() (string, error) { maxAge := 60 * 60 * 24 c := MyClaims{ UserName: "用戶名", StandardClaims: jwt.StandardClaims{ ExpiresAt: time.Now().Add(time.Duration(maxAge) * time.Second).Unix(), // 過期時(shí)間 NotBefore: time.Now().Unix(), // 生效時(shí)間 Issuer: "本人", // 簽發(fā)人 }, } // method 加密方法 工作多用jwt.SigningMethodRS256 // claims 實(shí)現(xiàn)Claims接口的結(jié)構(gòu)體 token := jwt.NewWithClaims(jwt.SigningMethodHS256, c) // 用私鑰加密token tokenStr, err := token.SignedString([]byte(SECRETKEY)) return tokenStr, err } // 解析token func ParseToken(tokenString string) (*MyClaims, error) { token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) } return []byte(SECRETKEY), nil }) if claims, ok := token.Claims.(*MyClaims); ok && token.Valid { return claims, nil } else { return nil, err } }
整合gin框架
package main import ( "fmt" "log" "time" "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" ) // 定義一個(gè)結(jié)構(gòu)體 實(shí)現(xiàn)jwt.StandardClaims type MyClaims struct { UserName string jwt.StandardClaims } // 定義一個(gè)結(jié)構(gòu)體 用來接收請求參數(shù) type LoginData struct { User string `form:"user" binding:"required"` Password string `form:"password" binding:"required"` } const ( SECRETKEY = "ghdrgdrgdrg34" //私鑰 ) // 驗(yàn)證token是否合法,合法則放行 func VerificationToken(c *gin.Context) { token := c.Request.Header.Get("token") log.Println(token) myClaims, err := ParseToken(token) if err != nil { c.JSON(401, gin.H{"status": err.Error()}) c.Abort() } else { c.Set("username", myClaims.UserName) c.Next() } } func main() { r := gin.Default() // 登陸接口 用戶名密碼必須穿root 123456 r.POST("/login", func(c *gin.Context) { var data LoginData // 在這種情況下,將自動(dòng)選擇合適的綁定 if c.ShouldBind(&data) == nil { fmt.Println(data.User, data.Password) if data.User == "root" && data.Password == "123456" { token, _ := GenerateToken(&data) c.JSON(200, gin.H{"token": token}) } else { c.JSON(401, gin.H{"status": "unauthorized"}) } } }) // 測試token是否有效 r.GET("/testToken", VerificationToken, func(c *gin.Context) { username, _ := c.Get("username") c.JSON(200, gin.H{"username": username}) }) r.Run(":8080") } // 生成token func GenerateToken(loginData *LoginData) (string, error) { maxAge := 60 * 24 c := MyClaims{ UserName: loginData.User, StandardClaims: jwt.StandardClaims{ ExpiresAt: time.Now().Add(time.Duration(maxAge) * time.Second).Unix(), // 過期時(shí)間 NotBefore: time.Now().Unix(), // 生效時(shí)間 Issuer: "本人", // 簽發(fā)人 }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, c) // 用私鑰加密token tokenStr, err := token.SignedString([]byte(SECRETKEY)) return tokenStr, err } // 解析token func ParseToken(tokenString string) (*MyClaims, error) { token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) } return []byte(SECRETKEY), nil }) if claims, ok := token.Claims.(*MyClaims); ok && token.Valid { return claims, nil } else { return nil, err } }
到此這篇關(guān)于golang整合jwt的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)golang整合jwt內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go項(xiàng)目實(shí)現(xiàn)mysql接入及web?api的操作方法
這篇文章主要介紹了go項(xiàng)目實(shí)現(xiàn)mysql接入以及web api,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08使用GO語言實(shí)現(xiàn)Mysql數(shù)據(jù)庫CURD的簡單示例
本文主要介紹了使用GO語言實(shí)現(xiàn)Mysql數(shù)據(jù)庫CURD的簡單示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08GoZero實(shí)現(xiàn)數(shù)據(jù)庫MySQL單例模式連接的簡單示例
在 GoZero 框架中實(shí)現(xiàn)數(shù)據(jù)庫的單例連接可以通過以下步驟來完成,GoZero 使用 gorm 作為默認(rèn)的數(shù)據(jù)庫操作框架,接下來我會(huì)展示一個(gè)簡單的單例模式實(shí)現(xiàn),需要的朋友可以參考下2025-02-02Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例
這篇文章主要為大家介紹了Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解
這篇文章主要為大家介紹了Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10