golang整合jwt的實現(xiàn)示例
更新時間:2024年08月29日 10:15:18 作者:code:404-not-found
json web tokens(jwt)已成為大多數(shù)web api設計中的常見身份驗證和授權(quán)方案之一,本文主要介紹了golang整合jwt的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
快速開始
下載包
go get github.com/dgrijalva/jwt-go
直接上代碼
package main
import (
"fmt"
"time"
"github.com/dgrijalva/jwt-go"
)
// 定義一個結(jié)構(gòu)體 實現(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(), // 過期時間
NotBefore: time.Now().Unix(), // 生效時間
Issuer: "本人", // 簽發(fā)人
},
}
// method 加密方法 工作多用jwt.SigningMethodRS256
// claims 實現(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"
)
// 定義一個結(jié)構(gòu)體 實現(xiàn)jwt.StandardClaims
type MyClaims struct {
UserName string
jwt.StandardClaims
}
// 定義一個結(jié)構(gòu)體 用來接收請求參數(shù)
type LoginData struct {
User string `form:"user" binding:"required"`
Password string `form:"password" binding:"required"`
}
const (
SECRETKEY = "ghdrgdrgdrg34" //私鑰
)
// 驗證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
// 在這種情況下,將自動選擇合適的綁定
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(), // 過期時間
NotBefore: time.Now().Unix(), // 生效時間
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的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)golang整合jwt內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go項目實現(xiàn)mysql接入及web?api的操作方法
這篇文章主要介紹了go項目實現(xiàn)mysql接入以及web api,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
使用GO語言實現(xiàn)Mysql數(shù)據(jù)庫CURD的簡單示例
本文主要介紹了使用GO語言實現(xiàn)Mysql數(shù)據(jù)庫CURD的簡單示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
GoZero實現(xiàn)數(shù)據(jù)庫MySQL單例模式連接的簡單示例
在 GoZero 框架中實現(xiàn)數(shù)據(jù)庫的單例連接可以通過以下步驟來完成,GoZero 使用 gorm 作為默認的數(shù)據(jù)庫操作框架,接下來我會展示一個簡單的單例模式實現(xiàn),需要的朋友可以參考下2025-02-02
Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例
這篇文章主要為大家介紹了Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
Golang基礎之函數(shù)使用(參數(shù)傳值)實例詳解
這篇文章主要為大家介紹了Golang基礎之函數(shù)使用(參數(shù)傳值)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10

