JWT用户登录机制

最近使用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黑名单的方法。
至此结束

你可能感兴趣的:(JWT用户登录机制)