package main
import (
"fmt"
"github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin"
"github.com/micro/go-micro/config"
"github.com/micro/go-micro/config/source/file"
"github.com/micro/go-micro/registry"
etcd2 "github.com/micro/go-micro/registry/etcd"
"github.com/micro/go-micro/web"
"time"
)
type Conf struct {
Name string
Etcd struct{
Address []string
}
}
type User struct{
Username string `json:"username"`
Password string `json:"password"`
jwt.StandardClaims
}
var jwtSecret=[]byte("ganganlee")
func main() {
// 加载配置文件
if err := config.Load(file.NewSource(
file.WithPath("./config/config.json"),
)); err != nil {
fmt.Println(err)
return
}
var cfg Conf
if err := config.Get().Scan(&cfg); err != nil {
fmt.Println(err)
return
}
etcd := etcd2.NewRegistry(func(options *registry.Options) {
options.Addrs = cfg.Etcd.Address//使用配置
})
//创建服务
server := web.NewService(
web.Name(cfg.Name),//使用配置
web.Registry(etcd),//将服务注册在etcd
web.Address(":8080"),//绑定端口
)
//注册路由
route := gin.Default()
//绑定路由api
route.GET("/", func(c *gin.Context) {
c.JSON(200,gin.H{
"code":200,
"msg":"ok",
})
})
//获取token
route.GET("/getToken", func(c *gin.Context) {
//指定加密密钥
//设置token有效时间
expireTime:=time.Now().Add(3*time.Minute)
claims:=User{
Username: "gangan",
Password: "123",
StandardClaims: jwt.StandardClaims{
// 过期时间
ExpiresAt:expireTime.Unix(),
// 指定token发行人
Issuer:"gin-blog",
},
}
tokenClaims:=jwt.NewWithClaims(jwt.SigningMethodHS256,claims)
//该方法内部生成签名字符串,再用于获取完整、已签名的token
token,err:=tokenClaims.SignedString(jwtSecret)
if err != nil {
c.JSON(400,gin.H{
"err":err.Error(),
})
}
c.JSON(200,token)
})
route.POST("/validateToken", func(c *gin.Context) {
//获取token
token := c.GetHeader("Authorization")
user := &User{}
//用于解析鉴权的声明,方法内部主要是具体的解码和校验的过程,最终返回*Token
tokenClaims, err := jwt.ParseWithClaims(token, user, func(token *jwt.Token) (interface{}, error) {
return jwtSecret, nil
})
if err != nil {
c.JSON(200,gin.H{
"result":err.Error(),
"code":400,
})
return
}
if tokenClaims!=nil{
// 从tokenClaims中获取到Claims对象,并使用断言,将该对象转换为我们自己定义的Claims
// 要传入指针,项目中结构体都是用指针传递,节省空间。
if claims,ok:=tokenClaims.Claims.(*User);ok&&tokenClaims.Valid{
c.JSON(200,gin.H{
"result":claims,
})
return
}
}
c.JSON(200,gin.H{
"result":"error",
"code":400,
})
})
//将路由注册到服务上
server.Handle("/",route)
//启动
if err := server.Run();err!= nil{
panic(err.Error())
}
}
jwt-go的基础使用
最新推荐文章于 2024-06-05 12:54:08 发布