在帮初创团队做web设计的时候,遇到了一个有意思的业务系统的问题,实现起来并不复杂,但是我觉得针对业务的理解比较有趣,简单记录一下啊。
业务背景
我们需要让没有账号的孩子在web端登录系统,那么既然没有账号,就只能让家长代为登录,这里的要求是,家长生成一个临时登录链接,孩子通过临时登录链接去登录系统,系统识别的身份是孩子的shadow user信息。
业务考虑
- 家长生成的带有token的链接必须是临时的,只能使用一次的,以保证安全。那么就需要在云函数中生成一个带有过期时间和使用次数的临时链接
- 孩子拿到临时链接,登录之后,为了长时间保持登录状态,需要用临时token换长期token。也就是后端云函数还需要解析临时链接,验证成功之后,再换出一个长期的token和refresh token
- 考虑JWT撤销能力,这个就比较麻烦。JWT本身提出的目的即将用户信息保存在客户端,服务端不保存,也就是无状态,那么服务端也就失去了对登录用户的控制能力。如果强行满足家长可以控制孩子账户登录登出,就必须要在服务端强行保存一部分状态。
- 采用access token(短期)+ refresh token(长期),把refresh token存储在redis中,这样想让孩子账户退出,只需要更新refresh token
- 采用token version,当server端检测到的version和前端传入的version不一致,就说明jwt过期了,强制退出