极简版抖音项目 引入jwt和redis,实现登录和获取登录信息 | 青训营

125 阅读4分钟

前言

昨天完成了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,感兴趣的同学可以自己上网搜索。

image.png

回忆昨天做MySQL,我们是在dal文件夹下面创建一个mysql文件夹,再写一个init。那么redis虽然没找到好的范例,不过我们也可以仿照mysql的init。

image.png 这是代码结构。 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查询

windows使用redis

抖音项目方案说明-第六届青训营后端项目

使用 Go 和 Redis 结合 JWT 进行权限认证| 青训营

也在这里放上我们项目的github仓库,欢迎大家交流学习、指出代码不足之处,我也是goland初学者,希望得到大佬指点。 bitdance