Token机制

5 篇文章 1 订阅
4 篇文章 0 订阅

一、什么是token

  token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。

  简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩的一定长度的十六进制字符串。为防止token泄漏)。

二、身份认证概述

  由于http是一种无状态协议,它并不不知道是谁访问了我们的应用。这里把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下次这个客户端再发送请求的时候,还得再验证一下。

  通常的解决方法就是,当用户请求登陆的时候,如果没有问题,在服务端生成一条记录,在这个记录里可以说明登陆的用户是谁,然后把这条记录的id发送给客户端,客户端收到以后把这个id存储在cookie中,下次该用户再次向服务器发送请求的时候,可以带上这个cookie,这样服务端会验证一下cookie里的信息,看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。这里的id值就是SesssionID,我们需要在服务端存储为用户生成的session,这些session会存储在内存,磁盘,或者数据库。

三、基于token的身份认证

  使用token机制的身份验证方法,在服务器端不需要存储用户的登录记录。大概的流程:

  客户端使用用户名和密码请求登录。服务端收到请求,验证用户名和密码。验证成功后,服务端会生成一个token,然后把这个token发送给客户端。客户端收到token后把它存储起来,可以放在cookie或者LocalStorage里。客户端每次向服务端发送请求的时候都要带上服务端发给的token。服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求的数据。

  利用token机制进行登录认证,可有以下方式:

  a. 用设备mac地址作为token

客户端:客户端在登录时获取设备的mac地址,将其作为参数传递到服务端。

服务端:服务端接收到该参数后,便用一个变量来接收,同时将其作为token保存在数据库,并将该token设置到session中。客户端每次请求的时候都要统一拦截,将客户端传递的token和服务器端session中的token进行对比,相同则登录成功,不同则拒绝。

  此方式客户端和服务端统一了唯一的标识,并且保证每一个设备拥有唯一的标识。缺点是服务器端需要保存mac地址;优点是客户端无需重新登录,只要登录一次以后一直可以使用,对于超时的问题由服务端进行处理。

  b. 用sessionid作为token

客户端:客户端携带用户名和密码登录

服务端: 接收到用户名和密码后进行校验,正确就将本地获取的sessionid作为token返回给客户端,客户端以后只需带上请求的数据即可。

此方式的优点是方便,不用存储数据,缺点就是当session过期时,客户端必须重新登录才能请求数据。

当然,对于一些保密性较高的应用,可以采取两种方式结合的方式,将设备mac地址与用户名密码同时作为token进行认证。

四、APP利用token机制进行身份认证

  用户在登录APP时,APP端会发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果验证成功,就会生成相应位数的字符串作为token存储到服务器中,并且将该token返回给APP端。

  以后APP再请求时,凡是需要验证的地方都要带上该token,然后服务器端验证token,成功返回所需要的结果,失败返回错误信息,让用户重新登录。其中,服务器上会给token设置一个有效期,每次APP请求的时候都验证token和有效期。

五、token的存储

  token可以存储到数据库中,但是有可能查询token的时间会过长导致token丢失(其实token丢失了再重新认证一个就好,但是别丢太频繁,别让用户没事就去验证)。

  为了避免查询时间过长,可以将token放到内存中。这样查询速度绝对就不是问题了,也不用太担心占据内存,就算token是一个32位的字符串,应用的用户量在百万级千万级,也占用不了多少内存的。

六、token的加密

  token是很容易泄露的,如果不进行加密处理,很容易被恶意拷贝并用来登录。加密的方式一般有:

在存储的时候把token进行对称加密存储,用到的时候再解密。文章开始提到的签名sign: 将请求URL、时间戳、token三者合并,通过加密算法进行加密处理。最好是两种方式相结合使用。还有一点,在网络层面上token使用明文传输是非常危险的,所以一定要用HTTPS协议。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值