用爱情公寓的一则故事污污地告诉你token到底是个什么鬼!!!

 
   先说个跟爱情公寓有关的鬼故事:
   曾小X带着胡O菲去开房了!
   结果来到这么一家诡异的酒店,
   他们来到大厅,贤哥告诉了前台他的账号与密码,前台根本没在听,直接给了他一块令牌
   接着他拿着令牌来到房门前,惊讶的发现:
   更诡异的是:
   所有的客房都没有钥匙孔,但是每间房们前都站着一个张伟。
   伟哥询问了他的姓名,随即拿出了一块令牌,
   然后与前台给的令牌进行比对,
   如果一致,贤哥就可以进门并射门了。
   从现在起,这家公寓成为了一家不需要保存用户账户信息的爱情公寓,你懂的lol!
   听完了这个故事,是不是深入理解了token呢?
   完全没有,似乎只有没羞没臊的画面哎
   这就对了,哈哈,请继续往下看:

 在以前没有token时,如果客户端频繁向服务端请求数据的话,
那么就意味着服务端频繁的去数据库查询用户名和密码并进行对比,
接着判断用户名和密码正确与否,最后作出相应提示。
毛病太显然了,意味我们不愿意频繁的访问数据库,针对这个问题,我们的解决办法是:
在用户第一次成功登陆后,服务器利用一些数据(可以是用户名和密码)生成一串字符,(生成基本都是字符串拼接然后md5加密)
并将此字符串返回给客户端,
接下来客户端再请求数据时,就不带用户名和密码了,
只带上这串字符,
服务器端根据请求接收传入的参数重新生成一串这样的字符,(生成方法还是字符串拼接然后md5加密)
将两个这样的参数一比较,一致就放行,不一致就作出拒绝提示;
整个过程请求登录过程是不是就不涉及用户名和密码到数据库的比对了?
就算是涉及也只是第一次用到而已.
这样一来就不用频繁的查询数据库然后做对比了。
这样生成一串字符解决这种问题的办法就是token机制;
这串字符就叫token(代币,象征,令牌);

现在回头看这个故事,是不是清楚多了??这样一来,token最核心的东西基本就搞清楚了;
但是,这还不够,这只有助于理解问题,无助于解决问题,解决相关问题的知识还依赖于一些更为细节的知识;
这些知识你应该知道:

1.token基本分为两种,一种是针对接口的token,一种是针对用户的token;

2.针对接口的token是干嘛用的?保证接口只给自家人(公司内部)用!

3.用户token是干嘛用的?用户token是避免用户名和密码多次提交,同时防止密码泄露;

4.接口token是怎么生成的?
   apitoken = md5('模块名' + '控制器名' + '方法名' + '2017-07-18' + 加密密钥)
            = 770fed4ca2aabd20ae9a5dd774711de2
   //方法就是:字符串拼接+md5加密
   上面这些数据是怎么获得的呢?不用担心,现在的接口基本都是mvc+restful风格:
   例如:http://blog.snsgou.com/模块名/控制器名/方法名?参数名1=参数值1&参数名2=参数值2&参数名3=参数值3
   这种URL在后端轻松就能解析出我们需要的数据,解出来之后拼接加密就完事了;

5. 服务器端如何利用接口token进行接口校检的呢?
   ①获取接口使用者的账号(为的是获取密钥)
   ②获取接口使用者的接口token(加下来要生成一个token与之对比)
   ③获取模块名,控制器名
   ④根据接口使用者的账号获取接口使用者对应的密钥
   ⑤根据以上四个数据重新生成一个token
   ⑥将客户端传过来的token和服务器生成的token进行校对,不相等表示验证失败
   ⑦验证通过,返回数据到客户端
 

猜你喜欢

转载自blog.csdn.net/weixin_42204641/article/details/82839031