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