分布式服务器设计思路:
redis+mysql+php
设计师:依宸;邮箱:2782268022@qq.com
一、mysql数据库
1、创建用户登陆表【user_login】
id | 绑定账号 | 用户id | 账号类型 |
---|---|---|---|
id | account | user_id | type |
1 | xiaolele@163.com | 100001 | |
2 | 18610006666 | 100002 | mobile |
2、创建用户安全表【user_safe】
用户id | 登陆密码 | 支付密码 |
---|---|---|
user_id | password | paypassword |
100001 | qwerasdfzxcvqwerasdfzxcvqwerasdf | |
100002 | rewqasdfzxcvqwerasdfzxcvqwerasdf |
3、创建用户信息基本表【user】
用户id | 昵称 | 等级 |
---|---|---|
id | nickname | grade |
100001 | 小乐乐 | 1 |
100002 | 美丽 | 1 |
二、redis【1】 鉴权token
用户鉴权前缀 【usertoken】
用户id(key) | 刷新密钥(value) | 到期时间 |
---|---|---|
userId | refreshToken | stoptime |
usertoken_100001 | rewqasdfzxcvqwerasdfzxcvqwerasdf | - |
用户信息前缀 【userinfo】
内容缓存
用户id(key) | 用户信息(value) | 到期时间 |
---|---|---|
userId | userInfo | stoptime |
userinfo_100001 | {nickname:小乐乐,grade:1,mobile:18610006666} | 1591156556 |
三、php业务逻辑
1、用户注册
1.1、输入用户名:18610006667;密码:12345678;密码加密后提交到服务器注册
1.2、服务器根据用户名查询用户登列表【user_login】;判断该用户名是否已经注册.
1.21、拿到用户登陆账号类型【type】——根据用户名规则检测登陆类型,拿到type=mobile。
1.3、服务器根据自定义规则生成用户唯一id user_id=100003
1.4、写入用户数据表【user】
id | nickname | grade |
---|---|---|
100003 | 未命名 | 0 |
1.5、写入登陆数据表【user_login】
id | account | user_id | type |
---|---|---|---|
3 | 18610006667 | 100003 | mobile |
1.6、写入用户安全表【user_safe】
user_id | password | paypassword |
---|---|---|
100003 | qwerasdfzxcvqwerasdfzxcvqwerasdf |
2、用户登陆
2.1、输入用户名:18610006667;密码:12345678;提交服务器注册。
2.2、服务器根据用户名查询用户登列表【user_login】;拿到用户id,user_id(100003);
2.3、服务器根据用户id拿到用户密码 password(qwerasdfzxcvqwerasdfzxcvqwerasdf)
2.4、验证用户输入的密码是否与数据库的密码相等;
2.5、根据user_id查询用户基本信息表【user】
拿到数据{user_id:100003,nickname:未命名}
2.6、自定义规则生成用户鉴权【refreshToken】refreshToken(rewqasdfzxcvqwerasdfzxcvqwerasdf)
2.7、存入redis缓存信息
用户鉴权缓存【usertoken】 设置有效期2天
userId | refreshToken | stoptime |
---|---|---|
usertoken_100003 | rewqasdfzxcvqwerasdfzxcvqwerasdf | 1591156556 |
用户信息缓存【userinfo】
userId | userInfo | stoptime |
---|---|---|
userinfo_100003 | {nickname:未命名,grade:0,account:18610006667,user_id:100003} | 1591156556 |
2.8、返回给用户的信息
{
userinfo:{user_id:100003,nickname:未命名,grade:0,account:18610006667},
token:{refreshToken:rewqasdfzxcvqwerasdfzxcvqwerasdf,stoptime:1591156556}
}
2.9、保存用户信息至本地缓存库
三、已登陆的用户快速访问服务器
客户端已存在用户数据={
userinfo:{user_id:100003,nickname:未命名,grade:0,account:18610006667},
token:{refreshToken:rewqasdfzxcvqwerasdfzxcvqwerasdf,stoptime:1591156556}
}
3.1、生成accessToken
获取当前时间time,生成规则:accessToken=md5(time+refreshToken);
3.2、组合密钥进行base64加密
进行加密处理(accessToken+当前时间+用户id)
header['sign']=base64_encode(accessToken.time.user_id)
3.3、携带sign向服务器发起请求
四、服务器验证sign
4.1、解密sign
$sign=base64_decode(sign);
$arr=explode(".",$sign);分割数组
拿到
[accessToken,time,user_id]
4.2、判断请求是否过期
time超过系统当前时间60秒(可自定义)即过期。
4.3、根据user_id 取出redis服务器usertoken信息。
4.4、把usertoken.refreshToken根据自定义规则生成accessToken
生成规则:accessToken=md5(time+usertoken.refreshToken);#这个time是前端发过来的time
4.5、判断服务器生成的accessToken是否和客户端发过来的accessToken相同。
4.6、验证通过后进行放行用户访问。
五、用户每次重新启动app刷新refreshToken值
用户每次重新启动app会自动重置refreshToken