一般情况有用户交互的项目都有认证授权功能,首先我们要搞清楚两个概念:认证和授权。
认证: 就是校验用户的身份是否合法,常见的认证方式有账号密码登录、手机验证码登录等。
授权:则是该用户登录系统成功后当用户去点击菜单或操作数据时系统判断该用户是否有权限,有权限则允许继续操作,没有权限则拒绝访问。
1. 小程序认证
1.1 小程序登录官方参考
我们先参考微信官方提供的小程序登录流程先大概知道小程序认证流程需要几部分,如下图:
(文档地址:小程序登录)
从图上可以看出小程序认证流程需要三部分:
小程序:即前端程序
开发者服务器:后端微服务程序。
微信接口服务:即微信服务器。
3.后端请求微信获取openid,发送appid、app密钥、code参数,微信返回openid
1.2 小程序认证流程
小程序的认证流程:(包括获取用户手机号)
微服务请求微信获取openid,初次认证将openid记录在数据库common_user表中。
微服务请求微信查询用户手机号并更新到数据库中。
2. 手机验证码认证
2.1 实现方案
1、提供发送验证码接口
传入手机号,向手机号发送验证码并将验证码存储在redis。
存储到redis使用string类型。
验证码key: PHONE:CODE:VERIFY_CODE_手机号
验证码 value: 6位随机数
验证码有过期时间:默认300秒
2、提供校验验证码接口
传入手机号及用户输入的验证码。 根据key从redis取出正确的验证码和用户输入的进行对比,一致说明验证码输入正确,否则输入错误,校验通过删除验证码。
3、对发送验证码接口进行限流,避免频繁发送验证码。
首先在前端操作频率控制,60秒内只允许发一次。
在后端通过对发送验证码接口进行限流。
2.2 手机验证码认证流程
手机验证码认证流程如下:
输入手机号。
点击发送验证码。
输入验证码,点击登录。
认证过程会先校验验证码是否正确,如果验证码正确再根据手机号查询数据库表是否存在相应记录且用户未被冻结,全部成功则认证通过。
3. 账号密码认证
通过用户名查询数据库获取加密后的密码,使用相同的加密算法对输入的密码进行加密,并与数据库中的加密密码进行对比。
如果认证通过,生成JWT(JSON Web Token)并返回给客户端,客户端后续请求将携带该Token。
4. 认证通过的用户信息保存
用户信息保存在两个地方:
前端的storage中:
后端的ThreadLocal中:
用户认证通过后端生成token返回给前端由前端保存,前端每次请求微服务会携带token访问。
网关收到前端的请求进行token校验,token不合法直接返回失败信息,token合法解析出用户信息放在http的head中继续请求微服务,在微服务中解析http头信息中的用户信息,写入ThreadLocal方便应用程序使用。