2019独角兽企业重金招聘Python工程师标准>>>
手机客户端与服务器端的通信,不同于浏览器与服务器端的通信。浏览器和服务器端的通信依靠session去维持一个会话, 当这一切搬到手机上仿佛一切都失效了。
1.在上一家公司的时候公司同事曾经问过我这个问题, 我当时想的解决办法是通过将sessionID附加到网址后面,或者放到hearder头中,维持会话。
2.或者干脆不维持会话,每次请求都通过签名认证,调用接口,拿数据。当然这样的效率肯定是最低的
3.到了新公司,看到google大牛推荐的一种方式。根据这种方式构建了一种类似于session的机制,一下主要是我的实现(有好的见解,欢迎喷~~):
1.用户表
mysql> desc auth_member;
+---------------------------+--------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |
+---------------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(50) | YES | UNI | NULL | |
| password | varchar(50) | YES | | NULL | |
| realname | varchar(50) | YES | | NULL | |
| email | varchar(100) | YES | UNI | NULL | |
| registry_time | datetime | YES | | NULL | |
| registry_ip | varchar(50) | YES | | NULL | |
| last_login_time | datetime | YES | | NULL | |
| update_time | datetime | YES | | NULL | |
| last_password_update_time | datetime | YES | | NULL | |
| total_login_times | int(11) | YES | | NULL | |
| avatar | varchar(255) | YES | | NULL | |
| is_first_login | int(11) | YES | | NULL | |
| delete_flag | int(11) | YES | | NULL | |
+---------------------------+--------------+------+-----+---------+----------------+
16 rows in set (0.00 sec)
2.token表
mysql> desc auth_log_token;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| uid | int(11) | YES | | NULL | |
| token | varchar(50) | YES | | NULL | |
| create_time | datetime | YES | | NULL | |
| refresh_time | datetime | YES | | NULL | |
| valid_time | datetime | YES | | NULL | |
| is_valid | int(11) | YES | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
id 标识,uid用户Id,token类似于session的唯一串根据一定算法声称,create_time生成时间,refresh_time 刷新时间,valid_time失效时间,is_valid是否失效
运作:
1.用户登录: https://(请求) username+password通过签名认证, 获取token,默认token有效时间可以根据用户设置的记住密码时间,或者默认30min
2.用户通过接口获取数据:用户请求服务器接口需要携带token和username,通过判断token是否有效,token和传递的用户名是否匹配等,验证token合法性
3.每次验证token成功更新refresh-time字段,valid_time时间更新,增加token有效时间
4.如果要构造单点登录,用户每次登陆判断token表中uid记录是否存在,如果存在直接更新;如果构建多点登陆,用户每次登陆,直接在token表中插入新记录。用户退出,直接将is_valid字段设为1(即已经失效),valid_time 设置为当前时间