最近使用gin框架开发程序,其中后台管理员登录使用jwt机制。
具体jwt是啥,本文章不想搬运其他文章内容,各位自行解决此问题。
准备
平台使用jwt-go扩展包
生成Token
本平台使用手机号与密码生成token
//生成token
import (
"github.com/dgrijalva/jwt-go"
"time"
)
var jwtSecret = []byte(setting.JwtSecret) //用来进行jwt的签发和jwt的验证
type Claims struct {
Telephone string `json:"telephone"`
Password string `json:"password"`
jwt.StandardClaims
}
func GenerateToken(telephone, password string) (string,time.Time, error) {
nowTime := time.Now()
expireTime := nowTime.Add(3 * time.Hour) //有效期 三个小时
claims := Claims{
telephone, //手机号
password, //密码
jwt.StandardClaims{
ExpiresAt: expireTime.Unix(),
Issuer: "test", //自定义平台标识
},
}
tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
token, err := tokenClaims.SignedString(jwtSecret)
return token,expireTime, err
}
解析token
//解析token
func ParseToken(token string) (*Claims, error) {
tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
return jwtSecret, nil
})
if tokenClaims != nil {
if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {
return claims, nil
}
}
return nil, err
}
刷新token
func RefreshToken(token string) (string, error,time.Time) {
jwt.TimeFunc = func() time.Time {
return time.Unix(0, 0)
}
tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
return jwtSecret, nil
})
if err != nil {
return "", err,time.Now()
}
if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {
jwt.TimeFunc = time.Now
expireTime := jwt.TimeFunc().Add(3 * time.Hour) //有效期 三个小时
claims.StandardClaims.ExpiresAt = expireTime.Unix()
get_tokens:=jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
new_token,err:=get_tokens.SignedString(jwtSecret)
return new_token,err,expireTime
}
return "", TokenInvalid,time.Now()
}
用户退出登录
包中暂未有修改token有效期的功能,所以对于用户退出登录需要自己实现,本人借鉴了广大网友提出的使用redis设置token黑名单的方法。
至此结束