在GOPATH目录下执行 go get -u github.com/dgrijalva/jwt-go下载工具包
package main
import (
"encoding/json"
"errors"
"fmt"
"github.com/dgrijalva/jwt-go"
"time"
)
//定义结构体(继承jwt.StandardClaims 结构体)
type MyClaims struct {
Username string `json:"username"`
Role string `json:"role"`
jwt.StandardClaims
}
//设置常量 定义过期时间时使用
const (
TokenExpireDuration = time.Hour * 2
)
//定义签名
var MySecret = []byte("Red B")
//生成token
func GenToken(username string)(string, error){
//新建结构体
c := MyClaims{
Username: username, //用户名
Role: "rwt" , //角色权限等。。。。
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), //过期时间
Issuer: "my-project", //签发人
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
return token.SignedString(MySecret)
}
//解析token (返回的是MyClaims的结构体)
func ParseToken(tokenString string)(*MyClaims, error ){
token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
return MySecret, nil
})
if err != nil {
return nil, err
}
if claims,ok := token.Claims.(*MyClaims);ok && token.Valid{
return claims,nil
}
return nil, errors.New("invalid token")
}
func main() {
token, err := GenToken("momo")
if err != nil {
fmt.Println(err)
return
}
//验证生成token
fmt.Println(token)
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>开始解析token")
parseToken, err := ParseToken(token)
if err != nil {
fmt.Println(err)
return
}
data, _ := json.Marshal(parseToken)
fmt.Println(string(data))
}