基本思路
每次打开小程序的启动页时,会有一个申请/检查 token 的机制,确保小程序本地有保存一个有效的鉴权 token。
在用户请求到对应业务逻辑之间,加入一个「鉴权」中间件。若鉴权 token 通过,则路由到对应的业务逻辑。若鉴权失败,则流程终止于鉴权中间件中。
启动页流程图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| +--------------------------------+ | 启动页 | +--------------------------------+ | | v +----+ +--------------------------------+ | 有 | <-- | 本地是否保存token | +----+ +--------------------------------+ | | | | | v | +--------------------------------+ | | 无 | | +--------------------------------+ | | | | | v | +--------------------------------+ | | 小程序wx_login请求token | | +--------------------------------+ | | | | | v | +--------------------------------+ | | 业务服务器带着token换取open_id | | +--------------------------------+ | | | | | v | +--------------------------------+ | | 返回token且小程序本地储存 | | +--------------------------------+ | | | | | v | +--------------------------------+ +------> | 跳到主页/请求页 | +--------------------------------+
|
业务请求流程图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| +---------------+ | 用户请求 | +---------------+ | | v +----+ +---------------+ | 无 | <-- | 是否带有token | +----+ +---------------+ | | | | | v | +---------------+ | | 有 | | +---------------+ | | | | | v | +---------------+ +----------+ | | token鉴定 | --> | 成功 | | +---------------+ +----------+ | | | | | | | v v | +---------------+ +----------+ | | 失败 | | 业务逻辑 | | +---------------+ +----------+ | | | | | v | +---------------+ +------> | 终止流程 | +---------------+
|
要点
- 鉴权是围绕着一个后端令牌(token)来进行的,整个用户请求过程不再出现 userId 或者 openId。
- 用户在登录时,根据自带的 wx_login 获得一个 code,后端服务器根据 code 与微信换取用户的唯一 ID 即 openId。后端服务器根据 openId 与对应用户绑定或新增,然后根据 userId 来生成一个 token 令牌。
- token 存储在 Redis 中,利用 Redis 的特性,可以实现过期自动销毁,以及删除 key 值使得令牌及时失效。