golang整合jwt的实现示例
下载包
go get github.com/dgrijalva/jwt-go
直接上代码
package mainimport ("fmt""time""github.com/dgrijalva/jwt-go")// 定义一个结构体 实现jwt.StandardClaimstype MyClaims struct {UserName stringjwt.StandardClaims}const (SECRETKEY = "ghdrgdrgdrg34" //私钥)func main() {// 生成tokentoken, _ := GenerateToken()// 解析tokenc2, err := ParseToken(token)if err != nil {fmt.Println("token解析失败", err.Error())}fmt.Println(c2.UserName)}// 生成tokenfunc GenerateToken() (string, error) {maxAge := 60 * 60 * 24c := MyClaims{UserName: "用户名",StandardClaims: jwt.StandardClaims{ExpiresAt: time.Now().Add(time.Duration(maxAge) * time.Second).Unix(), // 过期时间NotBefore: time.Now().Unix(), // 生效时间Issuer: "本人", // 签发人},}// method 加密方法 工作多用jwt.SigningMethodRS256// claims 实现Claims接口的结构体token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)// 用私钥加密tokentokenStr, err := token.SignedString([]byte(SECRETKEY))return tokenStr, err}// 解析tokenfunc 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}}
package mainimport ("fmt""log""time""github.com/dgrijalva/jwt-go""github.com/gin-gonic/gin")// 定义一个结构体 实现jwt.StandardClaimstype MyClaims struct {UserName stringjwt.StandardClaims}// 定义一个结构体 用来接收请求参数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 123456r.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")}// 生成tokenfunc GenerateToken(loginData *LoginData) (string, error) {maxAge := 60 * 24c := MyClaims{UserName: loginData.User,StandardClaims: jwt.StandardClaims{ExpiresAt: time.Now().Add(time.Duration(maxAge) * time.Second).Unix(), // 过期时间NotBefore: time.Now().Unix(), // 生效时间Issuer: "本人", // 签发人},}token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)// 用私钥加密tokentokenStr, err := token.SignedString([]byte(SECRETKEY))return tokenStr, err}// 解析tokenfunc 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}}
golang整合jwt的实现示例