【go】使用jwt库生成token
·
前言
最近项目中用到了token,在本次项目中的使用场景如下:
用户登录成功后,生成token,存入cookie,用来标识用户的身份
这次使用第三方库来实现 github.com/dgrijalva/jwt-go
代码
1.生成结构体
type Claims struct {
ID string
UserName string
jwt.StandardClaims // jwt中标准格式,主要是设置token的过期时间
}
2.定义密钥
注意,密钥不可以泄漏,否则数据将失去安全性。
// 签名
var sign = "string11"
3.生成token
// GenerateToken() 生成token
// 调用库的NewWithClaims(加密方式,载荷).SignedString(签名) 生成token
func GetnerateToken()(string,error) {
// 当前时间
nowTime := time.Now()
// 过期时间
expireTime := nowTime.Add(300 * time.Second)
// 签发人
issuer := "xxx"
// 赋值给结构体
claims := Claims{
ID :"345666",
UserName:"xxx",
StandardClaims:jwt.StandardClaims{
ExpiresAt: expireTime.Unix(), // 转成纳秒
Issuer: issuer,
},
}
// 根据签名生成token,NewWithClaims(加密方式,claims) ==》 头部,载荷,签证
toke,err := jwt.NewWithClaims(jwt.SigningMethodHS256,claims).SignedString([]byte(sign))
return toke,err
}
4.解析token,获取数据
// ParseToken 解析token
// 调用ParseWithClaims进行解析,使用签名解密出数据
func ParseToken(token string) (*Claims,error){
// ParseWithClaims 解析token
tokenClaims,err := jwt.ParseWithClaims(token,&Claims{}, func(token *jwt.Token)(interface{},error) {
// 使用签名解析用户传入的token,获取载荷部分数据
return []byte(sign),nil
})
if err != nil {
return nil,err
}
if tokenClaims != nil {
//Valid用于校验鉴权声明。解析出载荷部分
if c,ok := tokenClaims.Claims.(*Claims);ok && tokenClaims.Valid{
return c,nil
}
}
return nil,err
}
5.总结
1.token加密
将头部和载荷进行base64编码后,用"."拼接然后加盐(形成==>签名),最后用头部声明的加密方式进行加密。形成jwt的第三部分签名。
这个盐就是我们服务端的密钥。
2.token优点
1.字节占用小,传输简单
2.不需要在服务端存储,容易扩展
3.token缺点
1.由于存储在客户端,对于过期时间,服务端无法把控。出现问题,不安全。
2.载荷部分不能存放敏感信息,因为可以进行解码
以上就是本文所有内容,纸上谈来总觉浅,还是动手实践才更利于学习~
更多推荐


所有评论(0)