beego+jwt+redis小白入门版

首先 要清楚 jwt

当你理解 为什么 使用了 jwt 还要使用 redis的时候,好的过关了。

如果你不理解 没关系,
简单讲 jwt,就是 生成一个json格式的 token,这个token 里面含有 网页的登陆信息,是谁在登陆这个 网页,是个证明。

jwt里面 也有 token 有效期的注意。

那么为什么还要用 redis 呢,你可以想一下,如果 密码修改,或者退出登陆了,但是你之前 登陆过的 界面都还是可以继续使用,是不是一个安全问题?
所以强安全的系统是不允许 弹出的token 还继续用的。所以 用redis 存一下,再增加下 redis的检查。
如果重新登陆,token更新了,那么原来的token 就校验不过了。

再简单讲, 强安全系统 就增加redis 再管理下token,弱的安全系统,就不用redis,直接 jwt 就可以了。

再说redis,golang的redis包真的很多,我分别用不同的包封装过。
最后,我选择了,
“github.com/go-redis/redis”
这个呢,主要是因为 可以加时间有效期,我简单封装了下。

func GetRedisClientPool(address string) (*redis.Client, error) {
redisdb := redis.NewClient(&redis.Options{
Addr: address,
Password: “”,
DB: 0,
PoolSize: 100})

pong, err := redisdb.Ping().Result()
if err != nil {
	fmt.Println(pong, err)
}
return redisdb, err

}

func ClientSet(client *redis.Client, key string, value interface{}, inhour int) error {
defer client.Close()

err := client.Set(key, value, time.Hour*time.Duration(inhour)).Err()
if err != nil {
	fmt.Printf("try set key[foo1] to value[bar1] error[%s]\n",
		err.Error())
	//err_handler(err)
}
return err

}

你可能也是需要这样的结构
beego+jwt+redis小白入门版_第1张图片
在 beego.Router 前加入 过滤
beego+jwt+redis小白入门版_第2张图片
jwt的生成:自己定义一些 自己需要的 信息,一个便于 网页访问,一个便于 检查。

func Create_token(username string, userid string, secret string) (string, int64) {
expireToken := time.Now().Add(time.Hour * 12).Unix()
claims := Claims{
username,
userid,
jwt.StandardClaims{
ExpiresAt: expireToken,
Issuer: username,
},
}

// Create the token using your claims
c_token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

// Signs the token with a secret.
signedToken, _ := c_token.SignedString([]byte(secret))

return signedToken, expireToken

}

func Token_auth(signedToken, secret string) (username string, userid string, err error) {
claimsqqq := Claims{ /*
appid,
jwt.StandardClaims{
ExpiresAt: expireToken,
Issuer: appid,
},*/
}
token, err := jwt.ParseWithClaims(signedToken, &claimsqqq, func(token *jwt.Token) (interface{}, error) {
return []byte(secret), nil
})

if token == nil {
	return "", "", nil
}

if claims, ok := token.Claims.(*Claims); ok && token.Valid {
	//fmt.Printf("%v %v", claims.Username, claims.StandardClaims.ExpiresAt)
	//fmt.Println(reflect.TypeOf(claims.StandardClaims.ExpiresAt))
	//return claims.Appid, err
	return claims.Username, claims.Userid, err
}
return "", "", err

}

你可能感兴趣的:(小白,go,beego,jwt,redis)