go学习———jwt、token

15 篇文章 0 订阅

jwt、token在项目中的应用

jwt鉴权

在这里插入图片描述
在这里插入图片描述

项目应用


func Jwt(c *gin.Context) {
	//获取token
	token := c.Request.Header["auth"][0]
	//解析token
	t, err := util.ParseToken(token)
	if err != nil {
		fmt.Println(err.Error())
	}
	//判断时间是否过期
	if time.Now().Unix() > t.ExpiresAt  {
		c.JSON(http.StatusOK, gin.H{
			"code": 200,
			"msg":  "登录已过期",
		})
		//阻止后面函数进行
		c.Abort()
		return
	} else {
		//通过拦截器,继续执行后面函数
		c.Next()
	}
}

token

基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中。

这种概念解决了在服务端存储信息时的许多问题

NoSession意味着你的程序可以根据需要去增减机器,而不用去担心用户是否登录。

基于Token的身份验证的过程如下:

1.用户通过用户名和密码发送请求。

2.程序验证。

3.程序返回一个签名的token 给客户端。

4.客户端储存token,并且每次用于每次发送请求。

5.服务端验证token并返回数据。

每一次请求都需要token。token应该在HTTP的头部发送从而保证了Http请求无状态。我们同样通过设置服务器属性Access-Control-Allow-Origin:*
,让服务器能接受到来自所有域的请求。需要主要的是,在ACAO头部标明(designating)*时,不得带有像HTTP认证,客户端SSL证书和cookies的证书。
1.用户登录校验,校验成功后就返回Token给客户端。

2.客户端收到数据后保存在客户端

3.客户端每次访问API是携带Token到服务器端。

4.服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码

当我们在程序中认证了信息并取得token之后,我们便能通过这个Token做许多的事情。

项目应用

//声明一个结构体
type MyCliams struct {
	Id int
	jwt.StandardClaims
}

var MySigningKey = []byte("yuanjinyyds")

//生成token
func GetToken(id int)(string,error){
	//声明结构体变量
	c := MyCliams{
		Id : id,
		StandardClaims : jwt.StandardClaims{
             ExpiresAt: time.Now().Add(time.Hour*2).Unix(),  //签发时间
			 Issuer: "yuanjin",  //签发人
		},
	}
	//使用指定签名方法创建签名对象
	token := jwt.NewWithClaims(jwt.SigningMethodHS256,c)
	//使用指定的"yuanjinyyds"签名并获得完整的编码后的字符串token
	//注意这个地方一定要是字节切片不是字符串
	return token.SignedString(MySigningKey)
}

//解析token
func ParseToken(tokenString string)(*MyCliams,error){
	token,err := jwt.ParseWithClaims(tokenString,&MyCliams{},
	             func(token *jwt.Token) (i interface{},err error) {
                        return MySigningKey,nil
	             })
    if err != nil{
		return nil,err
	}
	if claims ,ok := token.Claims.(*MyCliams); ok && token.Valid{
		//校验token
		return claims,nil
	}
	return nil,errors.New("invalid token")
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值