beego+jwt+redis小白入门版 - Go语言中文社区

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.Router 前加入 过滤
在这里插入图片描述
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

}

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_43968835/article/details/91581670
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 17:37:00
  • 阅读 ( 2808 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢