美文网首页
会员登陆获取token设计思路1(足够让1万台电脑破解1万年)

会员登陆获取token设计思路1(足够让1万台电脑破解1万年)

作者: yichen_china | 来源:发表于2019-02-20 16:19 被阅读15次

分布式服务器设计思路:

redis+mysql+php
设计师:依宸;邮箱:2782268022@qq.com

一、mysql数据库

1、创建用户登陆表【user_login】
id 绑定账号 用户id 账号类型
id account user_id type
1 xiaolele@163.com 100001 email
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

六、refreshToken到期前24小时重置refreshToken值。

相关文章

网友评论

      本文标题:会员登陆获取token设计思路1(足够让1万台电脑破解1万年)

      本文链接:https://www.haomeiwen.com/subject/luthyqtx.html