jwt-go的基础使用

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())
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值