前言
昨天完成了Hertz和gorm,现在对于Hertz框架愈发熟悉了。今天在原来的基础上又实现了登录和获取登录信息两个接口。当然用的比较粗糙,只是简单的调用生成JWT,然后用户登录成功的时候返回token,之后用户访问接口都要带上token,经过核验之后才能响应其所需功能。
工具类
token的生成,写入,删除等等显然是一系列操作,所以我们可以把它写成一个工具类,这样调用就很方便了。 使用 Go 和 Redis 结合 JWT 进行权限认证| 青训营
根据IDL生成代码
根据IDL生成代码也不难,毕竟之前做过了,一回生二回熟。无非就是在idl文件夹下创建好proto文件,然后用 hz -update命令即可。不过这次也发现了一个问题。我原先打算把login.proto和register.proto分开写两个文件,然而这样的做法会出现问题。router会报错。通过观摩hertz官方demo,发现如果两个接口路径有公共部分,那么就要写在一个proto里面,否则就会出问题。 比方说,register.proto 里面有
service registerService{
rpc registerMethod(douyin_user_register_request) returns(douyin_user_register_response){
option (api.post) = '/douyin/user/register';
}
}
而我们想要实现的login.proto里面有
service loginService{
rpc loginMethod(douyin_user_login_request) returns(douyin_user_login_response){
option (api.post) = '/douyin/user/login';
}
}
有公共部分/douyin/user,所以分开写不行,索性把昨天的register.proto改名为user.go。然后把用户相关的三个操作(注册、登录、获取信息)都合在一起,这样就不会有问题了。为了防止代码文字比过高,对于message的定义就不放出来了,简单修改大作业里给的就是了,只放出路由的部分:
service loginService{
rpc loginMethod(douyin_user_login_request) returns(douyin_user_login_response){
option (api.post) = '/douyin/user/login';
}
}
service registerService{
rpc registerMethod(douyin_user_register_request) returns(douyin_user_register_response){
option (api.post) = '/douyin/user/register';
}
}
service userService{
rpc userMethod(douyin_user_request) returns(douyin_user_response){
option (api.get) = '/douyin/user';
}
}
Redis连接
Redis据说是官方不支持windows,不过微软有维护windows可用的版本,用来完成作业也是够用了。 Windows10下载redis 同时我还回忆以前用过的一个redis的可视化版本,类似于mysql的sqlyog、dbeaver等等。貌似叫做RDM,感兴趣的同学可以自己上网搜索。
回忆昨天做MySQL,我们是在dal文件夹下面创建一个mysql文件夹,再写一个init。那么redis虽然没找到好的范例,不过我们也可以仿照mysql的init。
这是代码结构。
redis下的init.go:
package redis
import "github.com/go-redis/redis"
const redisExpiration = 3600 // 过期时间,单位为秒
var Client = redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis 服务器地址和端口
Password: "", // 如果 Redis 密码为空,则不需要设置
DB: 0, // 使用默认的数据库
})
func NewRedisClient() {
_, err := Client.Ping().Result()
if err != nil {
panic(err)
}
}
然后根目录下的init.go顺道调用一下redis的init就可以了。同时,redis下的user.go也可以封装一下redis层面的数据库操作:
package redis
import "bitdance/biz/utils"
func CacheLogin(id string, token string) error {
return utils.CacheLoginInfo(Client, id, token)
}
这个函数就是封装了一层工具类缓存登录状态,id:token的键值对。
handler
然后就是主要的部分handler了。其实登录、获取登录信息等等的业务逻辑实在非常简单。这里就不放代码唠叨了。只要做到比较细心,写一个接口测好一个接口就可以了。登录的时候,验证用户名和密码是否能在数据库找到匹配的部分。如果能够找到,就创建一个token,存入redis,并把token返回前端。用户想要获取登录信息的时候,就带上id和token来访问后端。若能在redis正确解析,那就说明是正确登录状态、正常响应。否则就判断前端登录状态异常就好了。
引用
学习做项目,肯定要学习前人的经验: gorm查询
使用 Go 和 Redis 结合 JWT 进行权限认证| 青训营
也在这里放上我们项目的github仓库,欢迎大家交流学习、指出代码不足之处,我也是goland初学者,希望得到大佬指点。 bitdance